Как рассчитываете () работы?

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

0 ответов

Как указал Тодор, изучить запрос относительно просто. мы можем видеть, что код учитывает только tag_id, который находится в тегах показываемого сообщения.

ВЫБЕРИТЕ "blog_post". "Id", "blog_post". "Title", "blog_post". "Slug", "blog_post". "Author_id", "blog_post". "Body", "blog_post"."Publish", "blog_post"."created", "blog_post"."updated", "blog_post"."status", COUNT("taggit_taggeditem"."tag_id") AS "same_tags" FROM "blog_post"

ВНУТРЕННЕЕ СОЕДИНЕНИЕ "taggit_taggeditem" ON ("blog_post"."Id" = "taggit_taggeditem"."Object_id" AND ("taggit_taggeditem"."Content_type_id" = 7))

ГДЕ ("blog_post". "Status" = опубликовано

   AND "taggit_taggeditem"."tag_id" IN (SELECT DISTINCT U0."id" FROM "taggit_tag" 
                                                        U0 INNER JOIN "taggit_taggeditem" U1 ON (U0."id" = U1."tag_id") 
                                                        INNER JOIN "django_content_type" U2 ON (U1."content_type_id" = U2."id") 
                                                        WHERE (U2."app_label" = blog AND U2."model" = post AND U1."object_id" = 8)) 

   AND NOT ("blog_post"."id" = 8)) 

GROUP BY "blog_post"."Id", "blog_post". "Title", "blog_post". "Slug", "blog_post". "Author_id", "blog_post". "Body", "blog_post"."Publish", "blog_post". "created", "blog_post". "updated", "blog_post". "status"

ЗАКАЗАТЬ ПО "same_tags" DESC, "blog_post"."Publish" DESC LIMIT 4

Другие вопросы по тегам