Django:选择状态,按状态从表组_中计数(状态);

Django:选择状态,按状态从表组_中计数(状态);,django,django-orm,Django,Django Orm,我知道由于某种原因,Django没有groupby。但是,我需要获得每个可能状态下的项目数。这可以通过一个非常简单的查询完成: 选择状态,按状态从表组中计数(状态); 同时,在我们的项目中,我们尽可能多地使用Django ORM,到目前为止,除了在一些迁移中,我们从未在任何地方使用过原始SQL 在Django ORM中有没有一种方法可以在不获取重复项的情况下执行此操作?您可以使用它对查询集进行分组 from django.db.models import Count MyModel.objec

我知道由于某种原因,Django没有
groupby
。但是,我需要获得每个可能状态下的项目数。这可以通过一个非常简单的查询完成:

选择状态,按状态从表组中计数(状态);
同时,在我们的项目中,我们尽可能多地使用Django ORM,到目前为止,除了在一些迁移中,我们从未在任何地方使用过原始SQL

在Django ORM中有没有一种方法可以在不获取重复项的情况下执行此操作?

您可以使用它对查询集进行分组

from django.db.models import Count
MyModel.objects.values('status').annotate(num=Count('status'))
将返回

注意:如果您的模型或默认管理器上有任何订单,您必须首先通过添加
order\u by()

来删除该订单,您可以使用它对查询集进行分组

from django.db.models import Count
MyModel.objects.values('status').annotate(num=Count('status'))
将返回

注意:如果您的型号或默认管理器上有任何订单,您必须首先通过添加
order\u by()

删除该订单。您可以这样尝试(使用):

您可以这样尝试(使用):


问题是我得到的是数据库中每一行的status_计数,而不是每一种不同的状态。比方说,如果我做你的模型。对象。值('status')。注释(status_count=count('status'))。值列表('status','status_count'),我得到:[(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(4,1)]我用MySQL在Django 1.11(相当旧的版本)中进行了测试,我得到了这样的结果:
我正在使用Django 3.0和PostgreSQL。我仔细检查了一下,我的代码和你的完全一样。另外,你确定没有添加其他值,例如,如果你通过
值(…)
传递多个参数,那么它将不起作用。如果您的代码与我的完全相同,那么它应该可以工作。我查看了它生成的查询。事实证明,这里还有一个
groupby
子句。使用
.order\u by()
删除排序有帮助。问题是我得到的是数据库中每一行的状态计数,而不是每个不同状态的状态计数。比方说,如果我做你的模型。对象。值('status')。注释(status_count=count('status'))。值列表('status','status_count'),我得到:[(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(4,1)]我用MySQL在Django 1.11(相当旧的版本)中进行了测试,我得到了这样的结果:
我正在使用Django 3.0和PostgreSQL。我仔细检查了一下,我的代码和你的完全一样。另外,你确定没有添加其他值,例如,如果你通过
值(…)
传递多个参数,那么它将不起作用。如果您的代码与我的完全相同,那么它应该可以工作。我查看了它生成的查询。事实证明,这里还有一个
groupby
子句。使用
.order_by()
删除排序很有帮助。我为数据库中的每一行获取
num
[{'status':1,'num':1},{'status':1,'num':1},{'status':1,'num':1,{'status':1,{'status':1,'num':1},{'status':1,'num
这在Django 2.2和3.0中都适用,因此您的代码中除了我们在这里展示的内容之外还有其他内容。是否覆盖默认管理器(
对象
)?是否存在默认排序?我查看了它生成的查询。事实证明,这里还有一个group_by子句。使用.order_by()删除排序有帮助。我为数据库中的每一行获取
num
[{'status':1,'num':1},{'status':1,'num':1},{'status':1,{'status':1,'num':1},{'status':1,{'num'status':1,{'status':1,{'num
这在Django 2.2和3.0中都适用,因此您的代码中除了我们在这里展示的内容之外还有其他内容。是否覆盖默认管理器(
对象
)?是否存在默认排序?我查看了它生成的查询。事实证明,这里还有一个group_by子句。删除与的排序。order_by()有帮助。