0

我有以下型号

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)
    ...

我使用以下代码行以降序获取所选标签的热门文章

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

如何构建orm查询,通过模型的以下字段获取热门Article.favorited文章Vote

谢谢,

苏丹

4

2 回答 2

3

为什么会通过Vote模型获得“热门文章”?当您运行查询时,您最终会得到一个查询集Votes。然后,您必须发出额外的查询以从中获取Articles。

你应该使用:

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

然后,你有一个适当的Articles 查询集,你就可以开始了。

如果您想要收藏夹,您可以修改上面的内容以使用user而不是vote

Article.objects.filter(tags=tag).annotate(favorite_count=Count('user')).order_by('-favorite_count')
于 2012-05-17T15:20:01.863 回答
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))
于 2012-05-17T15:23:59.773 回答