【发布时间】:2019-08-11 14:28:47
【问题描述】:
我正在尝试获取最新 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('title', approved_count', 'pending_count', 'reject_count')
...这行得通,但它返回的帖子超过了最新的 100 个帖子,所以我认为它正在获取这些用户的所有帖子和汇总计数。
【问题讨论】:
-
这里的 10,5,1 等是什么?
-
如果您可以将查询集转换为不同的数据结构,例如
list,我很确定pandas有工具可以让这更容易。虽然不确定它们是什么 -
@JPG 已批准计数、待处理计数、已拒绝计数
-
我想我可以使用pandas..我大致知道如何使用它进行合并,但我想将其保留为数据库查询操作@Green Cloak Guy