在Django中有效地获取相关模型的数量

时间:2014-04-22 04:15:05

标签: python django django-queryset django-orm

我遇到类似这样的情况(实际代码绑定在模板中,为简洁起见省略。)

threads = Thread.objects.all()
for thread in threads:
    print(thread.comments.count())
    print(thread.upvotes.count())

我设法使用Django的令人敬畏的prefetch_related方法大大减少了查询总数。

threads = Thread.objects.prefetch_related('comments').prefetch_related('upvotes')

但是我想知道这种情况是否可以进一步优化。根据我的理解prefetch_related检索与相关模型相关的所有数据。看起来我只关心相关模型的数量,而不关心模型本身,似乎这个查询可以进一步优化,以便它不会检索一堆不必要的数据。有没有办法在Django中执行此操作而不降低到原始SQL?

1 个答案:

答案 0 :(得分:15)

你是对的,如果你想做的就是获取计数,那么从数据库中获取所有数据是浪费的。我建议注释:

threads = (Thread.objects.annotate(Count('comments', distinct=True))
                         .annotate(Count('upvotes', distinct=True)))
for thread in threads:
    print(thread.comments__count)
    print(thread.upvotes__count)

有关详细信息,请参阅annotation documentation