在 Django 中使多表继承设计通用

Cor*_*ker 5 python django inheritance

首先,一些指向我用来参考的页面的链接:A SO question和关于通用关系多表继承的 Django 文档。

到目前为止,我已经建立了一个多表继承设计。对象(例如:汽车、狗、计算机)可以继承 Item 类。我需要能够从数据库中检索项目,获取子类,并用它做一些事情。我的设计不允许一一检索不同类型的对象,所以我需要使用 Item 容器将它们全部包装成一个。一旦我有了这个项目,Django 文档说我可以通过引用带有模型名称的属性来获取子类(例如:myitem.car 或 myitem.computer)。

我不知道我的项目引用的是哪种类型的对象,那么我怎样才能得到孩子呢?有没有内置的方法来做到这一点?以下是我的一些其他想法:(有些比其他的更疯狂)

  1. 我想我可以向引用子类的 Item 添加某种 GenericForeignKey ,但我怀疑父类通过 ForeignKey 与子类相关联是否合法。
  2. 我想我可以在 Item 类中有一个 ForeignKey(ContentType),并根据 ContentType 的名称找到 Item 的属性以获取子项。
  3. 最后,虽然是一个丑陋的方法,但我可能能够保留一个对象类型列表,并尝试将每个类型作为一个属性,直到没有抛出DoesNotExist 错误。

正如您所看到的,这些提议的解决方案并不那么优雅,但我希望我不必使用其中的一个,这里的某个人可能会有更好的建议。

提前致谢

Wog*_*gan 5

我在我的一个项目中做了类似于方法 2 的事情:

from django.db import models
from django.contrib.contenttypes.models import ContentType

class BaseModel(models.Model):
    type = models.ForeignKey(ContentType,editable=False)
    # other base fields here

    def save(self,force_insert=False,force_update=False):
        if self.type_id is None:
            self.type = ContentType.objects.get_for_model(self.__class__)
        super(BaseModel,self).save(force_insert,force_update)

    def get_instance(self):
        return self.type.get_object_for_this_type(id=self.id)
Run Code Online (Sandbox Code Playgroud)

  • 是什么让你说这不是多表继承? (2认同)