在清理方法django中保存到数据库之前访问many2many字段值

时间:2017-11-01 10:10:38

标签: django django-models many-to-many

我有以下模型,我试图根据many2many字段的值在干净方法中引发验证错误

RULE_SET_CHOICES = (
    ('G', 'GLOBAL'),
    ('C', 'LOCAL')
)

class Books(models.Model):
    type = models.CharField(max_length=2, choices=RULE_SET_CHOICES, null=False, default='C')
    author = models.ManyToManyField(Author, related_name="books", blank=True, null=True)

    def clean(self):
        if self.type = 'G':
            // Check if type is Global and if we tried to associate / add authors  then raise a validation error 
            if self.author :
                raise ValidationError("When type is global, you should not associate authors")

但是当我尝试访问self.author时,我面临以下错误

*** ValueError: "<Books: Hello World- G>" needs to have a value for field "author " before this many-to-many relationship can be used

那么在保存到数据库之前有没有办法访问多对多关系字段值?因为我需要根据上面的值提出验证错误

1 个答案:

答案 0 :(得分:0)

如果您使用模型表单进行验证,则可以访问self.cleaned_data中的表单字段。

我不知道检查模型的clean方法中的值的方法。在访问多对多字段之前,您将检查self.pk

def clean(self):
    if self.pk and self.type = 'G':
        ...

请注意,self.author是相关管理员,因此if self.author始终为真。也许你想要self.author.exists()。由于可以有多个作者,因此最好将字段命名为authors