当前位置:  开发笔记 > 编程语言 > 正文

如何在django中查询GROUP BY?

如何解决《如何在django中查询GROUPBY?》经验,为你挑选了4个好方法。

我查询一个模型,

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"上做一些技巧,但我很想知道如何在没有修补的情况下做到这一点.



1> Guðmundur H..:

如果您要进行聚合,可以使用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}]


我有一个问题,这个查询只返回指定和dcount,如果我想得到表的其他值呢?
请注意,如果您的排序是指定以外的字段,则在不重置排序的情况下它将无法工作.请参见http://stackoverflow.com/a/1341667/202137
@Gidgidonihah是的,这个例子应该是`Members.objects.order_by('disignation').values('designation').annotate(dcount = Count('designation'))`
@Harry:你可以链接它.类似于:`Members.objects.filter(date = some_date).values('designation').annotate(dcount = Count('designation'))
我有一个问题,这个查询只返回指定和dcount,如果我想得到表的其他值呢?
你会如何添加另一个过滤器,让我们说按日期查找不同的值?
我可以在没有`count`的情况下执行查询吗?
@Clayton:将其他字段放在值括号内,如下所示:Members.objects.values('designation','field2','field3')。annotate(dcount = Count('designation'))

2> Michael..:

一个简单的解决方案,但不是正确的方法是使用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来获得相似的结果.


请注意,这不再适用于Django 1.9.http://stackoverflow.com/questions/35558120/query-group-by-in-django-1-9
嗨,如果您不使用聚合,您可以使用order_by模拟group_by并消除您不需要的条目.当然,这是一种仿真,只有在不使用大量数据时才可用.由于他没有谈到聚合,我认为这可能是一个解决方案.

3> inostia..:

您还可以使用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 %}

    {% for country in country_list %}
  • {{ country.grouper }}
      {% for city in country.list %}
    • {{ city.name }}: {{ city.population }}
    • {% endfor %}
  • {% endfor %}

看起来像这样:

印度

孟买: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



4> Van Gale..:

您需要执行自定义SQL,如此代码段中所示:

通过子查询自定义SQL

或者在在线Django文档中显示的自定义管理器中:

添加额外的Manager方法

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有