2016-09-29 6 views
1

私はannotating and aggregatingの始まりを読んでいると私は次のような状況を完了するために最適な方法と思いまして:シンプルジャンゴ集約 - 最適化

あなたはクエリセット内の各書籍のために著者の数をカウントします。

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 %} 

が他方より1つの状況優れているのチュートリアルでは、annotateと、次の示唆しますか?最適化のメリットがありますか?

答えて

1

、あなたがモデル照会する必要がありますので:

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

をして、あなたがcount()を呼び出す - あなたが複数のオブジェクト(図書)あなたが上count()を呼び出す各書籍のためのDBをヒットするためにそれを行うたら!

annotateを使用している場合は、DBを1回だけヒットし、すべてののdict/listとして結果を取得します。