我正在阅读注释和聚合的开头,我想知道哪种方式最好完成以下情况:
您想要计算查询集中每本书的作者数量。本教程对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一次,并将结果作为查询中所有图书的字典/列表。