验证一对多模型.parent不是self



假设我有以下模型:

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()方法正是正确的方法。

最新更新