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模型:禁止具有特定值的状态的主要内容,如果未能解决你的问题,请参考以下文章

如何禁止管理员在 Django 管理员中更改实例?

如何在Django中查询具有特定数量的外键关系并且在这些外键值中具有特定值的对象?

Django:在 GenericStackedInline 上禁止 can_delete

Django - 403 禁止。 CSRF 令牌丢失或不正确

禁止 Nestjs 中 DTO 的特定枚举值

是否可以禁止公共访问AWS文件,但只提供特定的Origin?