Django 做一个简单的 group by/count 语句

Posted

技术标签:

【中文标题】Django 做一个简单的 group by/count 语句【英文标题】:Django do a simple group by / count statement 【发布时间】:2014-08-04 18:25:18 【问题描述】:

假设我有以下内容:

我的选择 = ( (1,“选择1”), (2,“选择 2”), (3,“选择 3”), ) 类 MyModel(models.Model): 名称 = models.CharField(max_length=64, ) 类别 = models.CharField(max_length=4, 选择=MY_CHOICES)

现在,我想做的是按类别分组并获取每个组的实例数。例如,我想得到这样的结果:

选择 1:31 个实例 选择 2:4 个实例 选择 3:2 个实例

这可以通过以下查询来完成:

group_by_category = MyModel.objects.values('category').distinct().annotate(count=Count('category'))

上面的方法是可行的,因为values() 将返回一个 ValueQuerySet(其中包含 dicts 而不是 MyModel 实例)。所以我无法使用“get_category_display”来输出“Choice 1”、“Choice 2”等,但我只能打印数字。

有没有一种 DRY 方法可以使用 get_category_display 方法?

我知道我可以使用 for 循环自己添加显示值来修改每个 dict(如果 category=='1' 那么它的显示值是“Choice 1”等)但是我觉得这还不够干。

【问题讨论】:

最好为您的类别提供第二个模型,而不是使用选项。 @RodrigoOlmo 我知道这一点,但是我现在不想更改我的数据库架构。 【参考方案1】:
>>> dict(MY_CHOICES)[1]
"Choice 1"

为什么是distinct()?在这种情况下它有什么作用吗?

【讨论】:

以上是关于Django 做一个简单的 group by/count 语句的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模型上执行 INNER JOIN、GROUP BY 和 COUNT

Django上ManyToMany字段的唯一值

请教Django的User/Group/Permission管理

如何在 django 中将两列与 group by 相乘和求和

将用户添加到 django 中的组

有没有一种简单的方法可以在 django 中获取用户的组名