假设我有以下型号:
class Queue(models.Model):
name = models.CharField(max_length=50, unique=False)
parent = models.ForeignKey('self', blank=True, null=True,
related_name='children')
确保Queue永远不是自己的父级的最佳方法是什么?我现在正在做的是检查模型的clean()
方法中的内容:
class Queue(models.Model):
name = models.CharField(max_length=50, unique=False)
parent = models.ForeignKey('self', blank=True, null=True,
related_name='children')
def clean(self):
if self.id is not None:
if self.id == self.parent_id:
raise ValidationError('Queues cannot be their own parent.')
这是做事的最佳/正确方法吗?
答案 0 :(得分:1)
当您调用模型时,不会调用模型的
clean()
方法save()
方法。
...也就是说必须手动调用它,并且每次修改对象时都不会运行。
如果您正在使用ModelForm
或从Django管理员编辑对象,那么表单处理代码将在表单验证中调用clean()
方法。
但是,如果您的代码直接操作这些对象(而不是通过Form
)然后保存它们,则不会调用clean()
方法,也不会强制执行您的约束。您需要确保在保存对象之前手动调用Model.full_clean()
:
from django.core.exceptions import ValidationError
try:
queue.full_clean()
queue.save()
except ValidationError as e:
# Constraints are not met - don't save the object
PS:就ModelForm
验证而言,实施clean()
方法是正确的方法。