Django-完全覆盖模型字段的验证
我有一个模型,它通过表单获取日期时间,将其转换为unix时间,并将其保存为十进制。这是通过模型的Django-完全覆盖模型字段的验证,django,django-models,django-validation,Django,Django Models,Django Validation,我有一个模型,它通过表单获取日期时间,将其转换为unix时间,并将其保存为十进制。这是通过模型的clean方法实现的。问题在于clean方法似乎提供了额外的验证,而不是覆盖基本验证(“在这种情况下,它实际上是十进制的吗?”) 我有一个带有两个分支的if语句。如果模型未收到此字段的值,则保存当前时间戳。这是正确的。如果字段不是none,则第二个分支应该将datetime转换为时间戳并保存它。问题是,当它到达clean方法时,它已经抛出了一个验证错误,因为其他一些验证方法已经注意到输入是日期时间,而
clean
方法实现的。问题在于clean
方法似乎提供了额外的验证,而不是覆盖基本验证(“在这种情况下,它实际上是十进制的吗?”)
我有一个带有两个分支的if
语句。如果模型未收到此字段的值,则保存当前时间戳。这是正确的。如果字段不是none,则第二个分支应该将datetime转换为时间戳并保存它。问题是,当它到达clean
方法时,它已经抛出了一个验证错误,因为其他一些验证方法已经注意到输入是日期时间,而不是十进制
模型:
class CompanyAnnouncement(models.Model):
class Meta:
ordering = ['publish_datetime']
verbose_name = 'Company Announcement'
verbose_name_plural = 'Company Announcements'
company = models.ForeignKey(Company, on_delete=models.CASCADE)
publish_datetime = models.DecimalField(decimal_places=6, max_digits=18, help_text='Leave blank to publish immediately')
title = models.CharField(max_length=100)
document = models.FileField(upload_to='company_announcements', help_text='', null=True, blank=True)
def clean(self):
if self.publish_datetime:
try:
self.publish_datetime = self.publish_datetime.timestamp()
except:
raise ValidationError(_("Invalid datetime."))
else:
self.publish_datetime = dt.now().timestamp()
基本验证发生在字段的“clean”函数中。@WillemVanOnsem我在上面的代码中重写了
clean
,它无论如何都会抛出一个错误,因此在字段清理(其他清理函数)中必须有一些进一步的验证行为:@WillemVanOnsem啊,所以上面的转换应该在表单中发生,不在模型中?是和否:在表单中和模型上都会发生验证。表单执行更多操作(包括模型上的clean
,事实上,如果您.save()
模型对象,则不会调用.clean()
)。但是模型字段也执行清理(和验证)。