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

标签 python django inheritance

首先,一些指向我用作引用的页面的链接:A SO question ,以及 generic relations 上的 Django 文档和 multi-table inheritance .

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

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

  1. 我在想我可以添加一些东西 GenericForeignKey 的 Item that 提到了 child ,但我对此表示怀疑 父类甚至是合法的 通过外键与 child 相关 类。
  2. 我想我可以 项目中的 ForeignKey(ContentType) 类,并找到的属性 Item 获取 child 基于 ContentType 的名称。
  3. 最后,虽然是一个丑陋的方法,但我可以保留一个对象类型列表,并尝试将每个类型作为一个属性,直到不抛出 DoesNotExist 错误为止。

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

提前致谢

最佳答案

我在我的一个项目中做过类似方法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)

关于python - 在Django中使多表继承设计通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712683/

相关文章:

python - Django 管理静态文件 404

c++ - 如果在 C++ 中有多个继承模板,则非法调用非静态成员函数

Scala:用 val 覆盖 def

python - 如何计算两个列表的协整?

python - 如何在大型文件系统中查找重复文件同时避免 MemoryError

python - 是否有使用 OPA UA 传输数据的 IEC 61131/IEC 61499 PLC 功能 block ?

python - Anaconda中的python和原来的python的区别

python - Bitnami Django Stack 服务器无法识别新项目

python - 属性错误: 'WSGIRequest' object has no attribute 'getlist'

c++ - 观察者设计模式接口(interface)契约设计问题