В книге, которую я читаю, для подсчета общего количества тегов между несколькими сообщениями используется 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 (), когда у меня есть два тега?