Django模型:禁止具有特定值的状态

Posted

技术标签:

【中文标题】Django模型:禁止具有特定值的状态【英文标题】:Django model: forbid states with particular values 【发布时间】:2017-04-24 16:17:36 【问题描述】:

我想知道 Django 是否提供此功能,其他一些 Web 框架(例如 Ruby on Rails)是否提供。我说的是禁止保存属性值的某些状态的方法,例如:

model.active = False
model.authorized = True
model.save() # this should fail

我们可以有一个model,其中activeauthorized 都是TrueFalse,但我们不能有任何其他组合。抱歉,我现在想不出更好的例子,希望能理解其意图。

那么,Django 有什么方法可以处理这些情况吗?还是只有调用save方法时自己实现?

【问题讨论】:

【参考方案1】:

您可以覆盖模型上的保存方法。

class TestModel(models.Model):
    def save(self, *args, **kwargs):
        if self.active == False and self.authorized == True:
            raise ValidationError("Some descriptive text here")
        else:
            return super(TestModel, self).save(*args, **kwargs)

这是最简单的方法,但不是最好的。

您也可以覆盖clean 方法进行模型验证,但如果不通过ModelForm 使用此方法,则必须在调用保存之前显式调用full_clean

第三种方法仅在您使用表单接受更改时适用,在这种情况下您可以像上面那样覆盖clean,但是模型的full_clean是表单的clean方法,当表单的is_valid 方法被调用。

【讨论】:

并非所有视图都能handle the validation errors。干净的方法将是正确的方法

以上是关于Django模型:禁止具有特定值的状态的主要内容,如果未能解决你的问题,请参考以下文章