为什么在Django中没有简单的group_by?

时间:2016-10-04 12:36:46

标签: python django

我有一个模特:

class Person(models.MyModel):
    department = models.ForeignKey('Department')
    start_date = models.DateField()

class Department(models.SomeModel):
    name = models.CharField()

我希望在我的模板中能够创建一个简单的表格,我可以通过两个属性对人员进行分组:department__namestart_date

通过这种方式,在相同日期开始的具有相同部门名称的人将显示在同一行中。

我知道有一个名为regroup的模板标签,但我只能提供三个参数,其中只有一个可以是grouper

好吧,我以为我可以在view.py中使用类似的内容进行此查询:

Person.objects.all().group_by('start_date','department__name')

但我错了。没有这样的方法。

以任何方式以简单的方式实现这一目标?

编辑1

同一属性我指的是classe的对象。例如:

我们假设这是数据库:

姓名|部门|开始日期

鲍勃|销售| 12-12-2012

萨拉|销售| 12-12-2012

约翰|财务| 13-11-2012

然后以下函数将是这样的:

功能:

Person.objects.all().group_by('department__name', 'start_date')

输出:

销售| 12-12-2012 |鲍勃,萨拉

财务| 13-11-2012 |约翰

这样,Sara和John按部门 AND 开始日期分组。

2 个答案:

答案 0 :(得分:1)

这不是SQL分组所在 - 在SQL中你必须选择为Sales - 12/12行返回Bob或Sara中的哪一行,你不能同时拥有这两者。我在Python中进行这个处理,没有你想要的真正的SQL。

例如,保留(部门名称,日期)元组的字典和名称列表作为值:

from collections import defaultdict

table = defaultdict(list)

for department, date, name in Person.objects.values_list(
        'department__name', 'start_date', 'name'):
    table[(department, date)].append(name)

答案 1 :(得分:0)

您在django中使用group_by的方式是使用valuesaggregate

例如,您可以通过如下方式获得所需的结果:

Person.objects.all().values('department__name', 'start_date').annotate(Count('start_date'))

但是我相信你不能在一个字符串中获得所有的名字,而AFAIK你也无法在mysql的简单GROUP BY中完成它。

编辑:刚才我已经明白你想要group_by两个值,所以你会做类似的事情:

    Person.objects.all().values('department__name', 'start_date')\
        .annotate(Count('start_date'))\
        .annotate(Count('department__name'))\
        .values_list('department__name','start_date')