Я пытаюсь использовать Django ORM для агрегирования по полю и суммирования значения, возвращаемого декоратором. Я новичок в Django ORM, так что простите меня, если я что-то упустил.
Вот мой класс:
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 в поле."
Можно ли суммировать поле timdelta, созданное декоратором с помощью Django ORM? Это то, что я должен вычислить в представлении?
Кроме того, не совсем ясно, что должно произойти, если ClockOut
равно NULL
/None
. Это приведет к ошибке при получении .time_worked
.
Можно ли суммировать поле timdelta, созданное декоратором с помощью Django ORM? Это то, что я должен вычислить в представлении?
Нет. Свойство не существует на стороне базы данных. База данных ничего не знает о time_worked
. Это что-то определенное на уровне Django/Python. Если вы таким образом извлечете .time_worked
, Python просто извлечет .ClockOut
и .ClockIn
и вернет результат вычитания этих двух.
Вам, однако, не нужно time_worked
здесь. Вы можете вычесть ClockOut
из ClockIn
на стороне базы данных:
from django.db.models import DurationField, F, Sum
users_time_worked = Payroll.objects.aggregate(
total=Sum(F('clockOut') - F('clockIn'), output_field=DurationField())
)['total']
Вы не можете использовать свойство, так как база данных ничего не знает о
time_worked
. Свойство — это не поле в базе данных, это просто то, что Django/Python будет вычислять при получении.time_worked
.