gpt4 book ai didi

python - 如何合并两个查询集 django

转载 作者:行者123 更新时间:2023-12-01 01:06:47 24 4
gpt4 key购买 nike

我正在尝试获取最新 100 个帖子的列表,以及该帖子的用户已批准、待处理和拒绝的帖子的总数。

models.py

class BlogPost(models.Model):
POST_STATUSES = (
('A', 'Approved'),
('P', 'Pending'),
('R', 'Rejected')
)
author = models.ForeignKey(User)
title = models.CharField(max_length=50)
description = models.TextField()
status = models.ChoiceField(max_length=1, choices=POST_STATUSES)
<小时/>

views.py

现在我得到了这样的聚合计数,但我对如何将计数与帖子标题合并感到困惑

top_post_users = list(BlogPost.objects.values_list('user_id', flat=True))[:100]
users = User.objects.filter(pk__in=top_post_users).annotate(approved_count=Count(Case(When(user_posts__status="A", then=1),output_field=IntegerField()))).annotate(pending_count=Count(Case(When(user_posts__status="P", then=1),output_field=IntegerField()))).annotate(reject_count=Count(Case(When(user_posts__status="R", then=1),output_field=IntegerField())))
users.values('approved_count', 'pending_count', 'reject_count')
<小时/>

这就是我想要的结果:

  • 帖子标题、作者1、10、5、1
  • 帖子标题 2、作者 2、7、3、1
  • 帖子标题3、作者1、10、5、1
<小时/>

如何将返回的计数与标题合并?

我知道我可以使用 for 循环并附加每个循环,但从效率角度来看,我认为这不是正确的方法。有没有更有效的方法使用 django 数据库 ORM?

我已经尝试过了

users.values('标题'、approved_count'、'pending_count'、'reject_count')

...这确实有效,但它返回的帖子数量超过了最新 100 条帖子,因此我认为它获取了这些用户的所有帖子以及聚合计数。

最佳答案

最终,您需要一个 BlogPosts 列表:

main_qs = BlogPost.objects
# add filters, ordering etc. of the posts

您不仅希望在帖子标题旁边显示作者,还希望通过带注释的计数来丰富作者信息。

from django.db.models import OuterRef, Subquery, Count

# you need subqueries to annotate the blog posts
base_sub_qs = BlogPost.objects.filter(author__pk=OuterRef('author__pk'))

# add subqueries for each count
main_qs = main_qs.annotate(
user_approved_count=Subquery(base_sub_qs.filter(status="A").annotate(
c=Count('*')).values('c'), output_field=IntegerField()),
user_pending_count=Subquery(base_sub_qs.filter(status="P").annotate(
c=Count('*')).values('c'), output_field=IntegerField()),
user_rejected_count=Subquery(base_sub_qs.filter(status="R").annotate(
c=Count('*')).values('c'), output_field=IntegerField()),
)

然后您可以在模板中访问这些内容:

{% for post in posts %}
{{ post.title }}
{{ post.author.get_full_name }}
approved: {{ post.user_approved_count }}
pending: {{ post.user_pending_count }}
rejected: {{ post.user_rejected_count }}
{% endfor %}

文档:https://docs.djangoproject.com/en/2.1/ref/models/expressions/#subquery-expressions

关于python - 如何合并两个查询集 django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55268494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com