在我所读的书中,为了计算多个帖子之间共有的标签数量,使用了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]
就我而言,我有几个帖子,每个帖子都有两个标签。每个帖子仅与其他帖子共享一个标签。我正在获取我感兴趣的帖子包含的标签的ID列表。然后根据该列表,我过滤掉其他帖子。然后,我为所有帖子添加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 :(得分:0)
选择“ blog_post”。“ id”,“ blog_post”。“ title”,“ blog_post”。“ slug”,“ blog_post”。“ author_id”,“ blog_post”。“ body”,“ blog_post”。“发布”, “ blog_post”。“创建”,“ blog_post”。“更新”,“ blog_post”。“状态”,COUNT(“ taggit_taggeditem”。“ tag_id”)AS“ same_tags”来自“ blog_post”
INNER JOIN“ taggit_taggeditem” ON(“ blog_post”。“ id” =“ taggit_taggeditem”。“ object_id” AND(“ taggit_taggeditem”。“ content_type_id” = 7))
在哪里(“ blog_post”。“状态” =已发布
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“。”创建“,” blog_post“。”更新“,” blog_post“。”状态“
ORDER BY“ same_tags” DESC,“ blog_post”。“发布” DESC LIMIT 4