Count()如何工作?

时间:2018-11-21 06:31:06

标签: django django-models django-taggit

在我所读的书中,为了计算多个帖子之间共有的标签数量,使用了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()的一个?

1 个答案:

答案 0 :(得分:0)

正如Todor所指出的,查询是相对简单的。 我们可以看到该代码仅对显示在帖子标签中的tag_id进行计数。

选择“ 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

相关问题