如何解决TypeError:+不支持的操作数类型:“ DateField”和“ datetime.timedelta”
在我的模型中,有start_date_time
,end_date_time
,period
和period_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_save或post_save信号。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。