验证一对多model.parent不是self

时间:2015-11-06 20:18:16

标签: python django

假设我有以下型号:

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.')

这是做事的最佳/正确方法吗?

1 个答案:

答案 0 :(得分:1)

来自documentation

  

当您调用模型时,不会调用模型的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()方法是正确的方法。