gpt4 book ai didi

django - 模型和字段验证中的 clean() 方法

转载 作者:行者123 更新时间:2023-12-03 12:58:13 32 4
gpt4 key购买 nike

我对模型的 clean() 有疑问方法和基本现场验证。这是我的模型和 clean()方法。

class Trial(models.Model):

trial_start = DurationField()
movement_start = DurationField()
trial_stop = DurationField()


def clean(self):
from django.core.exceptions import ValidationError
if not (self.movement_start >= self.trial_start):
raise ValidationError('movement start must be >= trial start')
if not (self.trial_stop >= self.movement_start):
raise ValidationError('trial stop must be >= movement start')
if not (self.trial_stop > self.trial_start):
raise ValidationError('trial stop must be > trial start')

我的 clean()方法检查某些值是否在正确的范围内。如果用户忘记填写字段,例如 movement_start ,然后我得到一个错误:
can't compare datetime.timedelta to NoneType
我很惊讶我收到了这个错误,因为原来的 clean()函数应该能捕捉到缺失的条目(毕竟 movement_start 是必填字段)。那么如何基本检查缺失值,以及我的自定义检查值是否在特定范围内?这可以用模型的 clean() 来完成吗?方法,还是我需要使用 Forms ?

编辑1 为了更清楚: trial_start , movement_starttrial_stop都是必填字段。我需要写一个 clean()该方法首先检查所有三个字段是否都已填写,然后检查值是否在一定范围内。

例如,以下代码不起作用,因为 trial_start可能是空的。我想避免检查每个字段的存在 - django 应该为我做这件事。
class TrialForm(ModelForm):

class Meta:
model = Trial

def clean_movement_start(self):
movement_start = self.cleaned_data["movement_start"]
trial_start = self.cleaned_data["trial_start"]
if not (movement_start >= trial_start):
raise forms.ValidationError('movement start must be >= trial start')
return self.cleaned_data["movement_start"]

编辑2 我想将此检查添加到模型的 clean() 的原因方法是在 python shell 上创建的对象将自动检查正确的值。表单可以用于 View ,但我也需要对 shell 进行值检查。

最佳答案

您可以在模型中添加以下代码:

def save(self, *args, **kwargs):
self.full_clean()
return super().save(*args, **kwargs)
无论您在何处创建对象(表单、 View 、外壳、测试),都将调用验证。

关于django - 模型和字段验证中的 clean() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12278753/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com