我查询一个模型,
Members.objects.all()
它返回说
Eric, Salesman, X-Shop
Freddie, Manager, X2-Shop
Teddy, Salesman, X2-Shop
Sean, Manager, X2-Shop
我想要的是,知道最好的Django方法来触发group_by查询到我的数据库,就像,
Members.objects.all().group_by('designation')
当然这不起作用 . 我知道我们可以在“django / db / models / query.py”上做一些技巧,但我很想知道如何在没有修补的情况下做到这一点 .
9 回答
document表示您可以使用值对查询集进行分组 .
您可以使用以下代码找到所有书籍并按名称对它们进行分组:
你可以看一些cheet sheet here .
Django does not support free group by queries . 我以非常糟糕的方式学到了它 . ORM不是为了支持你想要做的事情而设计的,而不使用自定义SQL . 您仅限于:
RAW sql(即MyModel.objects.raw())
cr.execute
句子(以及对结果的手工解析) ..annotate()
(按照句子分组在.annotate()的子模型中执行,例如聚合lines_count = Count('lines'))) .在查询集
qs
上,您可以调用qs.query.group_by = ['field1', 'field2', ...]
,但如果您不知道您正在编辑哪个查询并且无法保证它将起作用并且不会破坏QuerySet对象的内部,则存在风险 . 此外,它是一个内部(未记录的)API,你不应该直接访问,而不会有代码不再与未来的Django版本兼容 .首先你需要导入Sum然后..
您还可以使用
regroup
模板标记按属性分组 . 来自文档:看起来像这样:
印度
孟买:19,000,000
加尔各答:15,000,000
美国
纽约:20,000,000
芝加哥:7,000,000
日本
东京:33,000,000
它也适用于
QuerySet
s我相信 .来源:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#regroup
有一个模块允许您对Django模型进行分组,并且仍然可以在结果中使用QuerySet:https://github.com/kako-nawao/django-group-by
例如:
'书/ books.html'
与
annotate
/aggregate
基本Django查询的不同之处在于使用相关字段的属性,例如:book.author.last_name
.如果需要已组合在一起的实例的PK,请添加以下注释:
注意:
ArrayAgg
是Postgres特定功能,可从Django 1.9开始提供:https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/aggregates/#arrayagg一个简单的解决方案,但不是以正确的方式使用RAW-SQL:
http://docs.djangoproject.com/en/dev/topics/db/sql/#topics-db-sql
另一种解决方案是使用group_by属性:
您现在可以迭代结果变量以检索结果 . 请注意,group_by没有记录,可能会在将来的Django版本中更改 .
而且......你为什么要使用group_by?如果不使用聚合,则可以使用order_by来获得相似的结果 .
如果我没有误会你可以使用,what-query-set.group_by = ['field']
您需要执行自定义SQL,如此代码段中所示:
Custom SQL via subquery
或者在在线Django文档中显示的自定义管理器中:
Adding extra Manager methods
如果您要进行聚合,可以使用aggregation features of the ORM:
这导致类似的查询
输出将是形式