1

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

您想计算查询集中每本书的作者数量。本教程建议以下内容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 %}

一种情况比另一种更好吗?我缺少优化的好处吗?

4

1 回答 1

1

因为那时您将不得不查询模型:

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

然后你打电话count()- 一旦你为多个对象(书籍)做这件事,你就会为你调用的每本书点击数据库count()

使用时,annotate您只需访问数据库一次,并将结果作为查询中所有书籍的字典/列表获取。

于 2016-09-29T22:10:41.440 回答