Python Django不';t调用模型清理方法

Python Django不';t调用模型清理方法,python,django,Python,Django,我有一个视图,它从CSV文件创建模型。我已经将clean方法添加到模型类定义中,但在创建模型时不会调用它 下面是models.py的示例: class Run(models.Model): name = models.CharField(max_length=120) tested_build = models.ForeignKey('apps.Build') timestamp_start = models.DateTimeField() timestamp_e

我有一个视图,它从CSV文件创建模型。我已经将clean方法添加到模型类定义中,但在创建模型时不会调用它

下面是models.py的示例:

class Run(models.Model):
    name = models.CharField(max_length=120)
    tested_build = models.ForeignKey('apps.Build')
    timestamp_start = models.DateTimeField()
    timestamp_end = models.DateTimeField()

class CommonMeasurement(models.Model):
    timestamp = models.DateTimeField()
    value = models.FloatField()
    run = models.ForeignKey(Run)

    def clean(self):
        super(CommonMeasurement, self).clean()
        print 'here we go'
        if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
            raise django_excetions.ValidationError('Measurement is outside the run')


class ClientMeasurement(CommonMeasurement):
    metric = models.ForeignKey(ClientMetric)
    account = models.CharField(max_length=120, blank=True)

导入程序为每个模型执行实际验证并调用create方法。

我找到了一个覆盖方法的解决方案:

class CommonMeasurement(models.Model):
    timestamp = models.DateTimeField()
    value = models.FloatField()
    run = models.ForeignKey(Run)

    objects = models.Manager()
    analyzes = managers.MeasureStatManager()

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

    def clean(self):
        super(CommonMeasurement, self).clean()
        print 'here we go'
        if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
            raise django_excetions.ValidationError('Measurement is outside the run')
类通用度量(models.Model):
timestamp=models.DateTimeField()
value=models.FloatField()
运行=模型。外键(运行)
objects=models.Manager()
analysis=managers.MeasureStatManager()
def保存(自身,**kwargs):
self.clean()
返回超级(通用测量,自)。保存(**kwargs)
def清洁(自清洁):
super(普通测量,自).clean()
打印“开始”
如果self.timestampself.run.timestamp\u结束:
引发django_异常。ValidationError('测量超出运行范围')

但我不确定这是否是一个好的决定。

显然,model.clean()从未被调用以确保向后兼容性。有关这方面的详细信息:

要调用模型清理方法,我们将覆盖save方法。检查链接:

类通用度量(models.Model):
timestamp=models.DateTimeField()
value=models.FloatField()
运行=模型。外键(运行)
def清洁(自清洁):
如果self.timestampself.run.timestamp\u结束:
引发django_异常。ValidationError('测量超出运行范围')
def保存(自身、*args、**kwargs):
self.full_clean()
返回super(CommonMeasurement,self).save(*args,**kwargs)

显然,在Django的较新版本中,
ModelForm.full\u clean
会调用其实例的
full\u clean
方法:


您可以发布查看代码吗?可能您正在调用的不是对模型表单有效吗?
clean
用于
ModelForm
Form
对象。不适合模特。这永远不会被自动调用。@karthikr--虽然您正确地认为不会自动调用此
clean()
,但您错误地认为它“不适用于模型”--请参阅“我相信从保存中调用clean将阻止ValidationError到达视图/模板,因此,如果debug=True,用户将看不到错误消息,但会看到一条调试消息w/traceback,如果debug=False,则会看到一个服务器错误。实际上,验证错误已成功传递到上层视图层。但是,在save()期间,Django不喜欢ValidationError,并返回一个(可怕的)500服务器错误,而不是400个错误请求。我仍然在寻找解决方案。我正在使用Django==2.2.5和djangorestframework==3.10.3,这个恼人的500错误仍然在发生!有解决方案吗?使用我的解决方案是一种不好的做法吗?从save自动调用clean()方法会破坏哪种兼容性?1。我的解决方案是将所有本应放在save()中clean()中的代码移动到save()。在这方面,我认为你的解决方案更干净。2.我不知道它应该破坏什么。是的,但是
save
也不会调用
full\u clean
。感谢@AdamBarnes,我已经更新了答案中的链接;)谢谢在
djangorestframework
中,未调用该方法的clean方法解决了我的问题。@SirSaleh您是设法将错误发送回REST api,还是只是显示了调试器错误?
class CommonMeasurement(models.Model):
    timestamp = models.DateTimeField()
    value = models.FloatField()
    run = models.ForeignKey(Run)

    objects = models.Manager()
    analyzes = managers.MeasureStatManager()

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

    def clean(self):
        super(CommonMeasurement, self).clean()
        print 'here we go'
        if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
            raise django_excetions.ValidationError('Measurement is outside the run')
class CommonMeasurement(models.Model):
    timestamp = models.DateTimeField()
    value = models.FloatField()
    run = models.ForeignKey(Run)

    def clean(self):
        if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
            raise django_excetions.ValidationError('Measurement is outside the run')

    def save(self, *args, **kwargs):
        self.full_clean()
        return super(CommonMeasurement, self).save(*args, **kwargs)