我查询一个模型,
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"上做一些技巧,但我很想知道如何在没有修补的情况下做到这一点.
如果您要进行聚合,可以使用ORM的聚合功能:
from django.db.models import Count Members.objects.values('designation').annotate(dcount=Count('designation'))
这导致类似的查询
SELECT designation, COUNT(designation) AS dcount FROM members GROUP BY designation
输出将是形式
[{'designation': 'Salesman', 'dcount': 2}, {'designation': 'Manager', 'dcount': 2}]
一个简单的解决方案,但不是正确的方法是使用RAW-SQL:
http://docs.djangoproject.com/en/dev/topics/db/sql/#topics-db-sql
另一种解决方案是使用group_by属性:
results = Members.objects.raw('SELECT * FROM myapp_members GROUP BY designation')
您现在可以迭代结果变量以检索结果.请注意,group_by没有记录,可能会在将来的Django版本中更改.
而且......你为什么要使用group_by?如果您不使用聚合,则可以使用order_by来获得相似的结果.
您还可以使用regroup
模板标记按属性进行分组.来自文档:
cities = [ {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'}, {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'}, {'name': 'New York', 'population': '20,000,000', 'country': 'USA'}, {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'}, {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'}, ] ... {% regroup cities by country as country_list %}
看起来像这样:
印度
孟买:19,000,000
加尔各答:15,000,000
美国
纽约:20,000,000
芝加哥:7,000,000
日本
东京:33,000,000
它也适用于QuerySet
我相信的.
来源:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#regroup
您需要执行自定义SQL,如此代码段中所示:
通过子查询自定义SQL
或者在在线Django文档中显示的自定义管理器中:
添加额外的Manager方法