Django тег git: почему annotate (same_tags = Count ('tags')) подсчитывает количество общих тегов вместо общего количества тегов? - PullRequest
2 голосов
/ 10 апреля 2020

Я следую инструкциям по Django 2 на примере .

Я не понимаю шаг (2): Почему Count('tags') не считает общее количество тегов, которыми обладает этот пост?

Я попытался выполнить поиск по справочнику API тегов git, но это не имеет отношения к делу.

Может кто-нибудь объяснить это мне, пожалуйста?


Следующий код:

(1) ищет похожие сообщения, просматривая их общие теги.

(2) использует функцию агрегации количества для генерации вычисляемого поля same_tags.

(3) упорядочивает результат по количеству общих тегов в порядке убывания et c ...

# List of similar posts
post_tags_ids = post.tags.values_list('id', flat=True)
similar_posts = Post.published.filter(tags__in=post_tags_ids)\
                              .exclude(id=post.id)
similar_posts = similar_posts.annotate(same_tags=Count('tags'))\
                             .order_by('-same_tags','-publish')[:4]

1 Ответ

1 голос
/ 10 апреля 2020

Я не понимаю, шаг (2): почему Count('tags') не учитывает общее количество тегов, которыми обладает этот пост?

Поскольку используется выражение .annotate(..) после предложения .filter(..). Таким образом, сначала вы фильтруете объединенную модель, а затем подсчитываете все еще сохраненные элементы.

Как описано в разделе агрегация документации :

При использовании с предложением annotate(), filter имеет эффект , ограничивающий объекты, для которых вычисляется аннотация . Например, вы можете создать аннотированный список всех книг с заголовком, начинающимся с «Django», используя запрос:

>>> from django.db.models import Avg, Count
>>> Book.objects.filter(name__startswith="Django").annotate(num_authors=Count('authors'))

Таким образом, вы создаете запрос, который выглядит следующим образом:

SELECT post.*
       COUNT(tag.id) AS same_tags
FROM post
INNER JOIN tag
WHERE tag.id IN <i>list_of_tag_ids</i>
  AND post.id != <i>id_of_post</i>
ORDER BY same_tags DESC, post.publish DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...