【问题标题】:Django- aggregating conditional child fieldsDjango-聚合条件子字段
【发布时间】:2020-05-05 20:40:03
【问题描述】:

假设我有以下模型。给定的Job 可以运行多天,有多个用户,并且这些用户可以设置各种标志(模型中的布尔值):

class Job(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=128)

class JobEmployee(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    date = models.DateField()
    job = models.ForeignKey(Job, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    is_sup = models.BooleanField()
    is_mgr = models.BooleanField()
    timecard_complete = models.BooelanField()

我想要做的是在每个工作的日期拉一份工作 ID、姓名、日期和所有孩子的数量列表,is_mgr==Trueis_sup==Truetimecard_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 表进行正常的聚合查询,但我也需要来自工作对象的数据。

【问题讨论】:

    标签: django group-by aggregate


    【解决方案1】:

    试试这个

    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))))
    

    如果没有你的结构就无法测试它,如果我用) 或类似的东西打印错误,请告诉我。

    【讨论】:

    • filter=Q() 对我来说是缺失的部分。我错过了文档中的那个参数。谢谢!
    猜你喜欢
    • 2010-12-20
    • 2018-12-04
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多