Да, вы можете использовать двойное подчеркивание (__
) для просмотра отношения:
from django.db.models import Count
Domain.objects.annotate(
<b>num_posts=Count('topics__posts')</b>
)
, если вы объедините это с подсчетом числа Topic
s, вам нужно будет добавить distinct=True
на Count
из Topic
с, поскольку это составит два JOIN
с, а JOIN
на Post
с будет действовать как « множитель »:
from django.db.models import Count
Domain.objects.annotate(
num_posts=Count('topics__posts'),
num_topics=Count('topics'<b>, distinct=True</b>)
)
Это приведет к следующему запросу:
SELECT domain.*
COUNT(post.id) AS num_posts
COUNT(DISTINCT topic.id) AS num_topics
FROM domain
LEFT OUTER JOIN topic ON topic.domain_id = domain.id
LEFT OUTER JOIN post ON post.topic_id = topic.id
GROUP BY domain.id
Если вы опустите distinct=True
, то же самое топи c будет считаться несколько раз раз (ровно столько же раз, сколько число сообщений, относящихся к этой теме c), и, следовательно, num_topics
должно быть таким же, как num_posts
. Используя DISTINCT
, мы подсчитываем количество уникальных тем в каждой группе.