Django ORM - 按装饰器聚合

Django ORM - Aggregate by Decorator

我正在尝试使用 Django ORM 按字段聚合并对装饰器返回的值求和。我是 Django ORM 的新手,所以如果我遗漏了什么请原谅我。

这是我的 class:

class Payroll(models.Model):
    job = models.ForeignKey(Job, on_delete=models.CASCADE)      
    user = models.ForeignKey(User, on_delete=models.CASCADE)    
    ClockIn = models.DateTimeField()
    ClockOut = models.DateTimeField(null=True, blank=True)

    @property
    def time_worked(self):
        return self.ClockOut - self.ClockIn

我想通过user聚合,总结time_worked装饰器。如果我自己写 SQL 它将是:

SELECT user, SUM(time_worked) 
FROM payroll
GROUP BY user

当我尝试时

users_time_worked = Payroll.objects.aggregate(Sum('time_worked'))

页面崩溃,Django 调试屏幕显示: “无法将关键字 'time_worked' 解析为字段。”

是否可以对装饰器使用 Django ORM 创建的 timdelta 字段求和?这是我应该在视图中计算的东西吗?

Is it possible to sum a timdelta field created by a decorator using the Django ORM? Is this something I should calculate within the view?

属性 not 存在于数据库端。数据库对 time_worked 一无所知。这是在 Django/Python 层定义的东西。如果您因此获取 .time_worked,Python 将简单地获取 .ClockOut.ClockIn,以及 return 这两个的减法。

但是您在这里不需要 time_worked。您可以在数据库端从 ClockIn 中减去 ClockOut

from django.db.models import DurationField, F, Sum

users_time_worked = Payroll.objects.aggregate(
    <b>total=Sum(F('clockOut') - F('clockIn'), output_field=DurationField())</b>
)['total']