假设我有以下模型:
class Queue(models.Model):
name = models.CharField(max_length=50, unique=False)
parent = models.ForeignKey('self', blank=True, null=True,
related_name='children')
确保队列永远不是自己的父级的最佳方法是什么?我现在所做的是检查模型的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.')
这是最好/正确的做事方式吗?
来自文档:
调用模型的
clean()
方法时,不会调用模型的CCD_ 3方法。
也就是说,它必须手动调用,并且不是每次修改对象时都运行。
如果您正在使用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()
方法正是正确的方法。