我有一个模特:
class Person(models.MyModel):
department = models.ForeignKey('Department')
start_date = models.DateField()
class Department(models.SomeModel):
name = models.CharField()
我希望在我的模板中能够创建一个简单的表格,我可以通过两个属性对人员进行分组:department__name
和start_date
。
通过这种方式,在相同日期开始的具有相同部门名称的人将显示在同一行中。
我知道有一个名为regroup
的模板标签,但我只能提供三个参数,其中只有一个可以是grouper
。
好吧,我以为我可以在view.py
中使用类似的内容进行此查询:
Person.objects.all().group_by('start_date','department__name')
但我错了。没有这样的方法。
以任何方式以简单的方式实现这一目标?
同一属性我指的是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 开始日期分组。
答案 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的方式是使用values
和aggregate
。
例如,您可以通过如下方式获得所需的结果:
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')