简单的Django聚合——优化



我正在阅读注释和聚合的开头,我想知道哪种方式最好完成以下情况:

您想要计算查询集中每本书的作者数量。本教程对annotate的建议如下:

Book.objects.annotate(Count('authors'))

我的问题是,当你可以用模型实例方法完成这一点时,为什么要这样做呢?

#models.py
class Book(models.Model):
  authors = models.ManyToManyField(Author)
  def author_count(self):
    return self.authors.count()
#views.py
books = Book.objects.all()
#template.html
{% for book in books %}
  {{ book.author_count }}
{% endfor %}

一种情况比另一种情况好吗?我是否错过了哪些优化好处?

因为这样您将不得不查询模型:

Books.objects.all()  # Or any other filter

,然后你调用count() -一旦你为多个对象(书籍)做了这件事,你将为你调用count()的每本书击中DB !

当使用annotate时,您将只击中DB一次,并将结果作为查询中所有图书的字典/列表。

相关内容

  • 没有找到相关文章

最新更新