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