我希望在子类中使用父类中的字段作为约束条件。
models.py
class ParentClass(object):
...
is_public = models.BooleanField(default=False)
class ChildClass(ParentClass):
...
price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
class Meta:
constraints = [
models.CheckConstraint(
check=Q(price__isnull=True) & Q(is_public=True), # <- here
name='price_exists_check',
)
]当我试图迁移时,我在我的终端中看到了这个错误:
myapp.ChildClass: (models.E016) 'constraints' refers to field 'is_public'
which is not local to model 'ChildClass'.
HINT: This issue may be caused by multi-table inheritance.很明显,我看到了这个错误(is_public字段位于ParentClass中)。我的问题是,这是根本不可能的,还是我可以重构一些东西?
我的最终目标是什么?
如果ChildClass is_pulic的实例是null,则不允许它更改为True。我希望在数据库级别执行此操作。
有办法吗?如果有,有什么需要改变的?
发布于 2021-10-20 20:55:10
我的问题是,这是根本不可能的,还是我可以重构一些东西?
我追踪到了原始提交,它引入了您正在看到的错误消息,以及它正在修复的错误。关于模型继承的文档也有助于理解这一点。
以下是我对这个问题的理解:
如果您创建一个从另一个模型继承的Django模型,并且该模型不是抽象的,那么Django将为父表创建一个外键,而不是重复子表中父模型中的所有字段。因此,当您创建一个ChildClass对象时,它会同时在ChildClass表和ParentClass表中创建一行。
不能创建引用多个表的CHECK约束。(据我所知)因此,Django禁止您创建此约束。
因此,您有以下选项:
https://stackoverflow.com/questions/69652350
复制相似问题