【问题标题】:compare fields in two different django models比较两个不同 django 模型中的字段
【发布时间】:2020-09-14 00:46:39
【问题描述】:

我正在尝试根据 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 中的员工匹配?

【问题讨论】:

  • aggregate() 的结果是一个字典,你试过读它的time_worked__sum 键吗?
  • 如何读取密钥?
  • 所以我这样做了,这就是它打印出来的内容:{'time_worked__sum': datetime.timedelta(seconds=41103, microseconds=281416)}。没有太多可采取的行动。
  • 什么意思? hours['time_worked__sum'] 是员工的time_worked 的总和。您可以将其设置为Employeehourssave()

标签: python-3.x django postgresql django-models


【解决方案1】:

这是我为解决我的问题所做的。

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 )

可能不是魔法,但它是可靠的,可靠的

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 2023-04-11
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多