1 回答
TA贡献1836条经验 获得超3个赞
选项 1:使用clean()
这不是你直接要求的,但它通常对 django 更友好,并且不需要像重写这样奇怪的东西save()
class Task(Model):
def clean():
# your code starts here
if not self.b_client:
self.client_repr = str(self.client)
else:
self.client_repr = str(self.b_client)
# your code ends here
由于此自定义clean()是在django 调用之前validate_unique()调用的,因此它应该满足您的要求。
选项 2:继续执行中的所有操作save()
要检查唯一约束,您可以执行以下操作:
from django.core.exceptions import ValidationError
def save(self, *args, **kwargs):
... # your code that automatically sets some fields
try:
self.validate_unique()
# self.full_clean() # <- alternatively, can use this to validate **everything**, see my comments below
except ValidationError:
# failed
# that's up to you what to do in this case
# you cannot just re-raise the ValidationError because Django doesn't expect ValidationError happening inside of save()
super().save(*args, **kwargs)
笔记:
只做并self.validate_unique()不能保证早期更新的save()值是好的并且不会违反其他内容
self.full_clean()更安全,但会稍微慢一些(多慢 - 取决于您拥有的验证器)
文档
Django文档说:
验证模型涉及四个步骤:
验证模型字段 - Model.clean_fields()
验证整个模型 - Model.clean()
验证字段唯一性 - Model.validate_unique()
验证约束 - Model.validate_constraints()
当您调用模型的full_clean()方法时,将执行所有四个步骤。
添加回答
举报