Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-完全覆盖模型字段的验证_Django_Django Models_Django Validation - Fatal编程技术网

Django-完全覆盖模型字段的验证

Django-完全覆盖模型字段的验证,django,django-models,django-validation,Django,Django Models,Django Validation,我有一个模型,它通过表单获取日期时间,将其转换为unix时间,并将其保存为十进制。这是通过模型的clean方法实现的。问题在于clean方法似乎提供了额外的验证,而不是覆盖基本验证(“在这种情况下,它实际上是十进制的吗?”) 我有一个带有两个分支的if语句。如果模型未收到此字段的值,则保存当前时间戳。这是正确的。如果字段不是none,则第二个分支应该将datetime转换为时间戳并保存它。问题是,当它到达clean方法时,它已经抛出了一个验证错误,因为其他一些验证方法已经注意到输入是日期时间,而

我有一个模型,它通过表单获取日期时间,将其转换为unix时间,并将其保存为十进制。这是通过模型的
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()
)。但是模型字段也执行清理(和验证)。