2015-11-06 42 views
1

假设我有以下型号:验证一个一对多model.parent不言

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

那是最好的/正确的方法做事情?

回答

1

documentation:当你打电话给你的模型 save()方法,则不会调用

模型的clean()方法。

......这就是说它必须手动调用,并且每次修改对象时都不运行。

如果您使用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()方法是完全正确的做法。

+0

太棒了,谢谢@solarissmoke。所以'clean()'是正确的方法,我会在每次手动处理事物时都要注意调用'full_clean()'。 –

+1

是的,这应该确保您的约束始终得到执行。 – solarissmoke