6

我祝大家有个美好的一天。正如我在标题中提到的,我想加入多个模型并使用一个全局 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: 'Parent' 对象没有属性 'fieldX'

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

4

1 回答 1

3

当你让Parent.objects.get(pk=1)你得到Child1Child2行没问题时,但 django ORM 正在返回你Parent的实例,因为它只是检索存储在 parent table 上的数据

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

This can get messy real quick if you have multiple child classes, since you have to know exactly to which child model the parent instance belongs to, to be able to access it (if you try, for example, to access parent.child1 being a Child2 instance, it will raise an exception).

I recommend you use the django-model-utils app, which defines a custom manager called InheritanceManager which you can use on your model and will take care of retrieving and returning the corresponding child model instance, making the whole process a lot easier.

于 2013-02-21T01:22:47.863 回答