장고

2011-10-13 1 views
0

에 태그를 기준으로 유사한 프로젝트를 얻으려면 어떻게 그들 사이의 다 대다 관계 내 응용 프로그램에서 ProjectTag 모델을 가지고있다. 각 프로젝트의 페이지에서 가장 공통된 태그를 가진 3 개의 추가 프로젝트를 나열하고 싶습니다. 이 쿼리를 어떻게 수행 할 수 있습니까? 단계로 세분화장고

Project.objects.filter(tags__in=current_project.tags.all()).annotate(Count('name')).order_by('-name__count')[:3] 

또는 :

class Tag(models.Model): 
    name = models.CharField(max_length=300) 

class Project(models.Model): 
    name = models.CharField(max_length=300) 
    ... 
    tags = models.ManyToManyField(Tag) 

답변

4

은 한 줄에 모든 것을 포장 할 수는 다음과 같이

tags = current_project.tags.all() 
matches = Project.objects.filter(tags__in=tags).annotate(Count('name')) 
results = matches.order_by('-name__count')[:3] 

논리가 간다 :

  1. current_project은 원하는 프로젝트의 인스턴스입니다. 전자 관계.
  2. filter는 현재 프로젝트와 동일한 태그가 모든 프로젝트를 선택합니다. annotate
  3. 은 비슷한 이름의 수를 계산 반환 값에 변수를 추가합니다. 여러 태그와 일치하는 프로젝트가 여러 번 반환되므로이 값은 일치 항목 수를 나타냅니다.
  4. 결과는 주석 name__count 변수에 분류되어 있습니다. 상위 3 개의 결과를 얻으려면 목록에 [:3]을 사용합니다.
+0

그리고 이것을 'Project' 클래스의 속성에 넣으십시오. 'current_project'를'self'로 대체하십시오. –

+0

감사합니다 !! 거의 완벽하게 일했습니다. 그것을 작동하게하는 하나의 작은 중요한 것 : 'from django.db.models import Count' – olegmil