Как работает Count ()? - PullRequest
       30

Как работает Count ()?

0 голосов
/ 21 ноября 2018

В книге, которую я читаю, для подсчета общего количества тегов между несколькими сообщениями используется Count из django.db.models.Для тегов используется taggit.Но я очень запутался, как работает эта функция

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]

В моем случае у меня есть несколько сообщений, и у каждого есть два тега.Каждый пост разделяет только один тег с другими постами.Я получаю список идентификаторов тегов, которые содержит интересующее меня сообщение.Затем по этому списку я отфильтровываю другие посты.Затем я добавляю параметр same_tags для всех постов, считая tags, которые у них есть.

Мое замешательство здесь, поскольку я сказал, что у меня есть два тега в каждом посте, но здесь по волшебству подсчитывается same_tagодин из которых представляет собой количество тегов, которые публикуются в публикации, представляющей мой интерес.Как это происходит?Вот мой тест в оболочке

>>> posts
[<Post: This is the other one >, <Post: Some content >, <Post: Other Post>,<Post: Temurs learning curv>]
>>> post = Post.objects.get(pk=1) 
>>> post_tags_ids = post.tags.values_list('id', flat=True)
>>> post_tags_ids
[2, 3]
similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
similar_posts[0].tags.count()
2
>>> similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags','-publish')[:4]
>>> similar_posts[0].tags.all()
[<Tag: jazz>, <Tag: temur>]
>>> similar_posts[0].same_tags
1

Как мне получить один для Count (), когда у меня есть два тега?

...