2012-05-17 3 views
0

에게 선택 I했습니다 내가 선택한 태그장고 : 핫/가장 인기있는 기사

Vote.objects.filter(tags__in=[tag]).annotate(num_articles=Count('article')).order_by('-num_articles')

에 대한 내림차순으로 인기있는 기사를 얻기 위해 코드의 라인을 다음을 사용

class Article(models.Model): 
    title = models.CharField(max_length=255, db_index=True) 
    slug = UniqueSlugField(prepopulate_from='title', unique=True) 
    favorited = models.ManyToManyField(to=User, blank=True) 
    tags = TaggableManager() 
    ... 

class Vote(models.Model): 
    article = models.ForeignKey(to=Article) 
    voter = models.ForeignKey(to=User, related_name='voter') 
    timestamp = models.DateTimeField(auto_now_add=True) 
    ... 

다음 모델 다음 필드로 인기있는 기사를 얻으려면 ORM 쿼리를 작성하는 방법 Vote 모델을 기반으로 Article.favorited 및?

감사합니다,

술탄

답변

3

왜 당신이 Vote 모델을 통해 "인기있는 기사"를 얻을 것? 쿼리를 실행하면 Vote의 쿼리 세트가 생성됩니다. 그런 다음 추가 쿼리를 실행하여 Article을 가져와야합니다.

당신은 사용해야합니다 :

Article.objects.filter(tags=tag).annotate(vote_count=Count('vote')).order_by('-vote_count') 

그런 다음, 당신은 Article s의 적절한 검색어 세트를 가지고 당신은 갈 수 있어요. 당신이 즐겨 찾기를 원하는 경우

, 당신은 vote 대신 user를 사용하는 위를 수정합니다 :

Article.objects.filter(tags=tag).annotate(favorite_count=Count('user')).order_by('-favorite_count') 
+0

짧고 명확한 답변을 주셔서 감사합니다 :) – sultan

0

사용이

Article.objects.filter(favorited__in=[...]).annotate(
     vc=models.Count('vote')).order_by('-vc') 

또는 일반적으로 빠른 (이하 조인)하지만, 더 복잡하고 가입 제한된 (더 이상 QuerySet은 아니지만 큰 문제는 일반적으로 아님) 하위 쿼리 버전

qs = Article.objects.filter(favorited__in=[...]) 
top_votes = Vote.objects.filter(article__in=qs).values('article').annotate(
     vc=models.Count('pk')).values_list('article', 'vc').order_by('-vc') 

# normally you may only want Top N 
top_n_pks = tuple(pk for pk, vc in top_votes[:N]) 
tops = sorted(Article.objects.filter(pk__in=top_n_pks).order_by(), 
     key=lambda x: top_n_pks.index(x.pk)) 
관련 문제