多个模型 - 一个通用主键(Django)

时间:2013-02-21 00:43:27

标签: django inheritance model primary-key parent-child

祝大家度过愉快的一天。正如我在标题中提到的,我想加入多个模型并使用一个全局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的父记录是Child1模型)

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

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

django返回 AttributeError:'父'对象没有属性'fieldX'

我的目标是为所有子模型创建一个主键。 Django有可能吗?分别是否有类似的解决方案或建议?我一直在搜索相关的主题,如 contenttype GUID,UUID ,但我想这不是我正在寻找的。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

当您Parent.objects.get(pk=1)时,您的Child1行和Child2行正常,但django ORM会返回Parent个实例,因为仅检索数据存储在父表

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

如果您有多个子类,这可能会变得非常麻烦,因为您必须确切地知道父实例属于哪个子模型,才能访问它(例如,如果您尝试访问{{ 1}}作为parent.child1实例,它会引发异常)。

我建议您使用django-model-utils应用,该应用定义了一个名为InheritanceManager的自定义管理器,您可以在模型上使用它,并负责检索和返回相应的子模型实例,从而实现整体处理起来容易得多。