首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django模型约束条件使用的字段继承类-它有可能吗?

Django模型约束条件使用的字段继承类-它有可能吗?
EN

Stack Overflow用户
提问于 2021-10-20 20:00:35
回答 1查看 537关注 0票数 1

我希望在子类中使用父类中的字段作为约束条件。

models.py

代码语言:javascript
复制
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',
            )
        ]

当我试图迁移时,我在我的终端中看到了这个错误:

代码语言:javascript
复制
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。我希望在数据库级别执行此操作。

有办法吗?如果有,有什么需要改变的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-20 20:55:10

我的问题是,这是根本不可能的,还是我可以重构一些东西?

我追踪到了原始提交,它引入了您正在看到的错误消息,以及它正在修复的错误。关于模型继承的文档也有助于理解这一点。

以下是我对这个问题的理解:

如果您创建一个从另一个模型继承的Django模型,并且该模型不是抽象的,那么Django将为父表创建一个外键,而不是重复子表中父模型中的所有字段。因此,当您创建一个ChildClass对象时,它会同时在ChildClass表和ParentClass表中创建一行。

不能创建引用多个表的CHECK约束。(据我所知)因此,Django禁止您创建此约束。

因此,您有以下选项:

  1. 在ORM层强制执行它。在clean()方法中,检查您的约束是否满足。(文档.)如果非Django程序修改数据库,这将不会防止违反约束。
  2. 使父类抽象。你已经说过这不可行了。
  3. 创建了第三个类,它们都是从继承的。创建如下所示的基类: 使BaseClass抽象,ParentClass和ChildClass具体化。这允许您使用约束,因为ChildClass数据现在只在一个表中。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69652350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档