[英]compare fields in two different django models
我正在嘗試根據 Timesheet 模型中的字段 (time_worked) 的聚合填充 Employee 模型中的字段(小時)。
模型.PY
class Employee(models.Model):
...
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='employees')
hours = models.DurationField(null=True, blank=True)
class Timesheet(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, null=True,)
time_worked = models.DurationField(null=True, blank=True)
我試過hours=Timesheet.objects.filter(employee=employee).aggregate(Sum('time_worked'))
但是當我嘗試插入 Employee 模型時,我就會出錯。
如果我這樣做, Employee.objects.filter(id=employee).update(hours=hours)
,我會收到錯誤“id 需要一個數字但得到了 Jacob”。 但是 Timesheet 中的 id 實際上是一個數字(外鍵)。
如何將只有員工 A 的Timesheet
模型中的time_worked
,並將結果插入到員工 A 的Employee
模型的hours
列中?
或者簡單地說,我如何將 Timesheet 中的員工與 Employee 中的員工進行匹配?
這是我為解決問題所做的工作。
class Employee(models.Model):
...
hours = models.DurationField(null=True, blank=True)
class TimeLog(models.Model):
...
employee = models.IntegerField(null=True, blank=True) # No foreignkey
time_worked = models.DurationField(null=True, blank=True)
def save( self, *args, **kwargs ):
employee_id = self.employee.pk #What's common for both models, very handy
#in the absence of a foreignkey
aggr_hours = TimeLog.objects.filter(employee=employee_id).values(
'employee').annotate(sum_hours=Sum(F('time_worked'),
output_field=DurationField()))
Employee.objects.filter(id=employee_id).annotate(total_hours=Subquery(
aggr_hours.values('sum_hours')[:1], output_field=DurationField()),
).update(hours=F('total_hours'))
super().save( *args, **kwargs )
可能不是巫術,但它堅固可靠
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.