Django-聚合条件子字段
假设我有以下模型。给定的Django-聚合条件子字段,django,group-by,aggregate,Django,Group By,Aggregate,假设我有以下模型。给定的作业可以运行多天,上面有多个用户,这些用户可以设置各种标志(模型中的布尔值): 我想做的是提取作业ID、名称、日期和所有子项的计数的列表,每个作业日期上具有is_mgr==True、is_sup==True和timecard_complete==False的子项。因此,结果将类似于: Job ID | Job Name | Date | all_users | mgr | sup | missing_
作业
可以运行多天,上面有多个用户,这些用户可以设置各种标志(模型中的布尔值):
我想做的是提取作业ID、名称、日期和所有子项的计数的列表,每个作业日期上具有is_mgr==True
、is_sup==True
和timecard_complete==False
的子项。因此,结果将类似于:
Job ID | Job Name | Date | all_users | mgr | sup | missing_tc
--------------------------------------------------------------------------------------
978294d8-3ae8-11ea-b77f-2e728ce88125 | Job 1 | 2020-01-05 | 8 | 2 | 0 | 4
978294d8-3ae8-11ea-b77f-2e728ce88125 | Job 1 | 2020-01-06 | 6 | 0 | 1 | 3
f5e87902-3ae8-11ea-b77f-2e728ce88125 | Job 2 | 2020-01-05 | 10 | 1 | 3 | 7
f5e87902-3ae8-11ea-b77f-2e728ce88125 | Job 2 | 2020-01-06 | 5 | 0 | 1 | 0
如何使用django查询实现这一点
编辑:编辑以引入职务名称,因为我意识到我可以只对JobEmployee表进行常规聚合查询,但我也需要来自职务对象的数据。试试这个
from django.db.models import Count, Q
(Job.objects.values('id', 'name', 'jobemployee__date')
.annotate(all_users=Count('jobemployee'))
.annotate(mgr=Count('jobemployee__is_mgr', filter=Q(jobemployee__is_mgr=True)))
.annotate(sup=Count('jobemployee__is_sup', filter=Q(jobemployee__is_sup=True)))
.annotate(missing_tc=Count('jobemployee__timecard_complete', filter=Q(jobemployee__timecard_complete=False))))
如果没有您的结构,就无法测试它,请告诉我是否用)
或类似的东西打印错误。我缺少过滤器=Q()
。我在文档中遗漏了那个参数。谢谢
from django.db.models import Count, Q
(Job.objects.values('id', 'name', 'jobemployee__date')
.annotate(all_users=Count('jobemployee'))
.annotate(mgr=Count('jobemployee__is_mgr', filter=Q(jobemployee__is_mgr=True)))
.annotate(sup=Count('jobemployee__is_sup', filter=Q(jobemployee__is_sup=True)))
.annotate(missing_tc=Count('jobemployee__timecard_complete', filter=Q(jobemployee__timecard_complete=False))))