2016-09-29 3 views
1

Я читаю зачатки annotating and aggregating и мне интересно, каким образом лучше выполнить следующую ситуацию:Простой Джанго Aggregation - Оптимизация

Вы хотите, чтобы подсчитать число авторов для каждой книги в QuerySet. Учебник предлагает следующие с 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 %} 

ли одна ситуация лучше, чем другие? Есть ли преимущества оптимизации, которых я не хватает?

ответ

1

Потому что тогда вам придется запросить модель:

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

, а затем вы звоните count() - После того, как вы это делаете для нескольких объектов (книги) вы попали в базу данных для каждой книги, которую вы называете count() на!

При использовании annotate вы попадете в БД только один раз и получите результат в виде dict/list для всего книг в запросе.