多个模型 - 一个公共主键 (Django)

Posted

技术标签:

【中文标题】多个模型 - 一个公共主键 (Django)【英文标题】:Multiple models - One common primary key (Django) 【发布时间】:2013-02-06 05:05:42 【问题描述】:

祝大家有个美好的一天。正如我在标题中提到的,我想加入多个模型并使用一个全局 ID 标识其中一个,因此 ID 将确定它是哪个模型,并且我将访问它的所有字段。

目前我正在与多表继承作斗争,但我遇到了问题。我想要一个父模型和几个子模型,它们会继承父的一些字段。

class Parent(models.Model):
    pass

class Child1(Parent):
    fieldX = models.CharField()

class Child2(Parent):
    fieldY = models.CharField()

但是我想使用主键通过父模型访问子模型。所以...

Parent.objects.all()

还应该返回 Child1 和 Child2 对象及其字段(fieldX、fieldY)。

(假设 pk=1 的 Parent 记录是 Child1 模型)

虽然当我尝试通过父模型访问子字段时

child = Parent.objects.get(pk=1)
child.fieldX

django 返回 AttributeError: 'Parent' object has no attribute 'fieldX'

我的目标是为所有子模型创建一个类似一个主键的东西。这在 Django 中可能吗?分别有没有类似的解决方案或建议?我一直在搜索 contenttypeGUID、UUID 等相关主题,但我想这不是我想要的。感谢您的帮助!

【问题讨论】:

【参考方案1】:

当您创建 Parent.objects.get(pk=1) 时,您将获得 Child1Child2 行,但 django ORM 会返回您 Parent 实例,因为它仅检索存储在父表上的数据.

要获取子模型的实例,您必须执行parent_instance.childmodelname

如果您有多个子类,这可能会很快变得一团糟,因为您必须确切知道父实例属于哪个子模型才能访问它(例如,如果您尝试访问 @987654328 @ 是 Child2 实例,它会引发异常。

我建议您使用django-model-utils 应用程序,它定义了一个名为InheritanceManager 的自定义管理器,您可以在您的模型上使用它并负责检索和返回相应的子模型实例,从而使整个过程变得更加容易.

【讨论】:

以上是关于多个模型 - 一个公共主键 (Django)的主要内容,如果未能解决你的问题,请参考以下文章

Django模型:使用多个值作为键?

在 Graphene Django 中查询多个模型

如何安全地更改 Django 模型中主键字段的值?

Django模型基于外键自动递增主键

如何使用 Django 中另一个模型的主键获取条目?

django 模型-----定义模型