当前位置: 首页 > 面试题库 >

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

傅英喆
2023-03-14
问题内容

首先,提供一些指向我参考的页面的链接:一个SO问题,以及有关通用关系和多表继承的Django文档。

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

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

  1. 我当时想我可以在引用孩子的Item上添加某种GenericForeignKey,但是我怀疑父类通过ForeignKey与子类进行关联甚至合法。
  2. 我想我可以在Item类中具有ForeignKey(ContentType),然后根据ContentType的名称找到Item的属性以获取子级。
  3. 最后,尽管这是一个丑陋的方法,但我也许可以保留一个对象类型列表,并尝试将每个类型用作属性,直到没有引发DidsNotExist错误为止。

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

提前致谢


问题答案:

我在一个项目中完成了与方法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)


 类似资料:
  • 问题内容: Django中对单表继承有显式支持吗?最后我听说,该功能仍在开发和辩论中。 在此期间是否可以使用库/黑客来捕获基本行为?我有一个混合了不同对象的层次结构。具有Employee类,雇员类型的子类和manager_id(parent_id)的公司结构的规范示例将很好地逼近我正在解决的问题。 就我而言,我想代表一个想法,即一个员工可以在由另一个员工管理的同时管理其他员工。没有用于Manage

  • 问题内容: 您如何处理在Java中仅具有单一继承的问题?这是我的具体问题: 我有三个(简化的)课程: 这是我认为最基本的实现,但是我想进行其他实现。 可以说我想添加一个新的变量,比如wordLength,但是我想使用继承来添加它。意思是我不想修改那个原始的AbstractWord类。即与此类似: 我知道java不允许我这样做,但是它使我的代码非常难看。现在,每当我添加一个字段时,我都将其添加到Ab

  • 问题内容: 我有一个解决方案,我认为我可以照顾模型继承,但是现在再来看一下,它实际上并不能解决我的问题。我希望能够调用一个模型,然后让我可以访问子模型的字段。对于继承,我仍然必须将子模型名称放在命令行中,这会破坏整个目的。这是我想要的示例: 我想做的是: 并使其运行相应的渲染功能。例如,如果pk与Note模型对齐,则它将仅返回self.id。当然,这简化为我要使用这些功能执行的操作。 我不必使用模

  • 问题内容: 我正在设计一个包含许多主要实体类型的新实验室数据库。 每个实体的表将包含该实体的所有类型(entity_id,created_on,created_by等)通用的字段。然后,我将使用具体继承(每个唯一的属性集使用单独的表)来存储所有剩余字段。 我相信这是每天通过实验室的标准数据类型的最佳设计。但是,我们经常有一个特殊的样本,这些样本通常伴随着原始者想要存储的特定值。 问题: 我应该如何

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A

  • 问题内容: 许多经验丰富的开发人员建议不要使用Django多表继承,因为它的性能很差: Django的疑难杂症:混凝土继承由雅各布·卡普兰,莫斯,Django的一个核心因素。 从长远来看,在几乎每种情况下,抽象继承都是一种更好的方法。我已经看到了不止几个站点在具体继承所带来的负担下被压垮,因此我强烈建议Django用户对具体继承的任何使用都带有大量怀疑态度。 Django的两个独家新闻,作者Dan