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']
我正在尝试使用 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']