Django通过反向关系聚合

2024-04-29 15:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这与this question有关,但略有不同。你知道吗

为了简单起见,假设我有模型(使用Django 1.7):

class TimesheetEntry(models.Model):
    date = models.DateField()
    employee = models.CharField(max_length=255)
    hours = models.FloatField()

class OnCallEntry(models.Model)
    timesheet = models.ForeignKey(TimesheetEntry)
    minutes = models.FloatField()
    comment = models.CharField(max_length=255)

其中,对于特定的时间表tentry/天,可以有多个oncallentry,每个oncallentry都有待命的分钟数。我想查询员工工作的总小时数,以及通话的总分钟数。你知道吗

为此,我有一个查询:

query = TimesheetEntry.objects.all().filter(employee="John Smith").aggregate(
            total_hours = Sum('hours'),
            total_oncall_minutes = Sum('oncallentry__minutes')
        )

但是,当给定时间表有多个OnCallEntry时,单个时间表的小时数乘以OnCallEntry数,导致总的\u小时数总和发生偏差。(据我所知,这是由于django处理连接的方式)。当我不包括“总通话分钟数”部分时,它会按预期工作。你知道吗

对于总时数部分,我只想得到不同时间表的总和。我更愿意在一个查询中完成这一切,因为实际上,我有更多的聚合函数要用其他相关模型执行。你知道吗

我尝试过在中添加distinct关键字的所有变体,例如:

...Sum('hours', distinct=True)..
...Sum('oncallentry__minutes', distinct=True)..
...filter(employee="John Smith").distinct().aggregate(...

但这些似乎不起作用。任何帮助都将不胜感激!你知道吗

谢谢


Tags: 模型modelmodelsemployee时间表classcharfieldsum