Python Django不';t调用模型清理方法
我有一个视图,它从CSV文件创建模型。我已经将clean方法添加到模型类定义中,但在创建模型时不会调用它 下面是models.py的示例: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
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)