Если вы хотите посчитать количество Blog
с на Category
, мы можем сделать аннотацию для Category
:
from django.db.models import Count
Category.objects.annotate(
num_blogs=<b>Count(<s>'Categories'</s>)</b>
)
Но (как указано позже), используя categories
поскольку связанное имя совершенно неверно и должно быть переименовано в blogs
, поскольку это обратное отношение, в этом случае запрос выглядит так:
from django.db.models import Count
Category.objects.annotate(
num_blogs=<b>Count(<s>'blogs'</s>)</b>
)
В результате получается QuerySet
, содержащий все Category
объектов и каждый Category
объект будут иметь атрибут num_blogs
, который содержит количество блогов, связанных с этой категорией.
Преимущество аннотаций состоит в том, что вы избегаете " N + 1 проблема ": здесь мы все еще выполняем один запрос, а не один запрос для категорий и n запросов для получения блогарассчитывать на эту конкретную категорию.В MySQL запрос будет выглядеть следующим образом:
SELECT category.*, COUNT(blog.id)
FROM category
LEFT OUTER JOIN blog ON blog.category_id = category.id
GROUP BY category.id
Примечание : обычно атрибуты в Python начинаются со строчной буквы (и используют подчеркивание между словами), поэтому blog_title
иcategory
вместо Blog_title
и Category
Примечание : related_name
- это имя, которое вы даете объектам обратное отношение, поэтому related_name
из category = ForeignKey(..)
должно быть 'blogs'
, а не 'categories'
.