django - Django 2.2 - 如何表达两个字段之间的约束
问题描述
我有几个看起来像这样的模型:
class AlarmStatus(Enum):
UNDEFINED = "Undefined"
PENDING = "Pending"
CUSTOMER_PENDING = "Customer Pending"
@classmethod
def choices(cls):
return tuple((i.name, i.value) for i in cls)
class Alarm(models.Model):
managed = models.BooleanField(default=False, blank=False, verbose_name="Managed ?")
status = models.CharField(
max_length=20, default=AlarmStatus.UNDEFINED.name, choices=AlarmStatus.choices()
)
class Meta:
constraints = [
models.CheckConstraint(
check=Q(managed=False) & Q(status=AlarmStatus.UNDEFINED.name),
name="if_managed_is_False_status_must_be_UNDEFINED")
]
我想在数据库级别强制执行以下不变量:
如果警报managed
字段为 False,则其status
字段必须为 "UNDEFINED"。
即我想声明以下状态/组合为非法:
managed
== 错误和status
==(待定 | CUSTOMER_PENDING)
我该如何执行?
我尝试了上述约束,但它显然是错误的,因为它强制每个行managed
字段必须为 False 并且每行都status
必须是 UNDEFINED。
谢谢
解决方案
蕴涵[wiki](即A → B)可以表示为¬A∨B,因此您可以将其表示为:
models.CheckConstraint(
check=Q(managed=True) | Q(status=AlarmStatus.UNDEFINED.name),
name="if_managed_is_False_status_must_be_UNDEFINED"
)
因此,这意味着如果managed
是,则满足检查True
(从那时起我们不关心status
,或者状态应该是UNDEFINED
。
推荐阅读
- javascript - 防伪令牌 Axios Asp .Net Core
- ruby-on-rails - 添加 gem docx_converter 后运行“rails s”时出现问题
- typescript - 是否可以在 Typescript 中定义非空数组类型?
- ruby-on-rails - 在 Rails 中初始化后如何将 args 更新为 Sidekiq cron 作业
- sql - 如何从具有公共列的不同表中获取结果
- html - Gzip字符串无法连接到字符串
- git - github 中的 Windows/Unix 行尾问题
- powershell - Citrix 解决方法中的 Chrome 崩溃
- graphql - 访问 Apollo 服务器以进行 NestJS GraphQL 测试
- floating-point - 有人能够理解这段代码中实现了什么样的除法算法吗?