TypeError:+不支持的操作数类型:“ DateField”和“ datetime.timedelta”

问题描述

在我的模型中,有start_date_timeend_date_timeperiodperiod_type字段,其中end_date_time必须等于start_date_time的总和和timedelta。在我的情况下,timedelta的天等于period,而period_type是天/月/年/中的一个。这是我的代码

models.py

class PeriodTypeEnum(models.IntegerChoices):
    Years = 'years'
    Months = 'months'
    Days = 'days'

class Policy(models.Model):
    policy_type = models.ForeignKey('PolicyType',on_delete=models.CASCADE)
    blank = models.OnetoOneField('blank_app.Blank',on_delete=models.CASCADE)
    period = models.IntegerField()
    period_type = models.IntegerField(choices=PeriodTypeEnum.choices)
    start_date_time = models.DateField(blank=True,null=True)
    end_date_time = models.DateField(default = start_date_time + timedelta(days=1),blank=True,null=True)

P.S:在end_date_time字段中,timedelta(天+ x)-x必须等于period

解决方法

Django不支持default中的依赖项。

最简单的方法是声明

end_date_time = models.DateField(blank=True,null=True)

并添加一个

def clean(self):
    if not self.end_date_time:
         # (or do something with `self.period`?)
         self.end_date_time = self.start_date_time + timedelta(days=1)

到模型。请记住,.clean()仅由表单等来调用,而不是在您.save()时被调用,因此,如果您希望这样做,则也需要覆盖.save()

def save(self,**kwargs):
    self.clean()
    return super().save(**kwargs)
,

此代码将不起作用,因为start_date_time不是值,而是保留值的字段。

如上一个答案中所述,您可以重写clean / save方法来设置end_date_time的值。另一种选择是根据设置start_date_time的时间/方式使用pre_savepost_save信号。