【问题标题】:Does Django support model classes that inherit after many non-abstract models?Django 是否支持继承许多非抽象模型的模型类?
【发布时间】:2009-12-16 18:07:10
【问题描述】:

假设我有三个 django 模型类 - 我们称它们为 A、B 和 C。如果 A 和 B 是抽象的,我可以这样做:

class C(A,B):
    pass

如果它们不是抽象的,而我也这样做呢?一切是否仍能正常工作?还是我弄错了,这也不应该用抽象模型来完成?

我遇到了一些问题,我将其归因于答案可能是否定的,但如果有人知道,我仍然希望确定这一点:) 我为此拥有的具体用例可能由Generic Relations 提供更好的服务(我最近才发现它们的存在),所以我想如果 Django 团队做出这样的设计决定是可以理解的(我看不到很多人需要这样做)。我只是想知道是什么情况。

编辑 1(在多米尼克的回答之后)

有趣...我们遇到的问题是一个类似于 IMDb 的结构(我认为 IMDb 比我们实际拥有的主题更容易理解,所以我将使用它们作为示例)。在 IMDb 上,他们有人物页面和电影页面,人物和电影都有自己的留言板。

我们最终通过创建一个名为 MessageboardOwner 的模型(只有一个属性 - 由 Django 自动添加的 id)将留言板连接到人物和电影,该模型“拥有”留言板,人物和电影继承它。问题是我们的“People”类也继承自另外两个类。类定义类似于:

class Person(A,B,MessageboardOwner):

最初这似乎很好,但今天发生了一件相当奇怪的事情......我正在删除管理员中的一个人,管理员问“你确定吗?”问题并向我展示了它必须删除的其他对象。它试图删除两个留言板,而不是一个。其中一个留言板应该属于电影,而不是个人。

查看数据库中的确切内容后,我发现此 Person 实例使用与 Movie 相同的 MessageboardOwner 实例。当我使用它时,结果是仅在 MessageboardOwner 之后继承的 Movie 类似乎工作正常。但是,保存 Person 仅在 MessageboardOwner 对象不存在的情况下创建了一个对象(或者可能覆盖了现有的对象 - 我不确定)。我还发现从 A、B 和 MessageboardOwner 继承的 id 字段总是相等的,这对我来说似乎很奇怪。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    是的,您可以对模型使用普通的 Python 多重继承。不过请记住这个警告:

    就像 Python 的子类化一样, Django 模型可以 从多个父模型继承。 请记住正常的 Python 名称 解决规则适用。第一基地 具有特定名称的类(例如 Meta) 中出现的将是 用来;例如,这意味着 如果多个父母包含一个 Meta 上课,只有第一个会去 被使用,所有其他人将被 忽略。

    一般情况下,您不需要继承 来自多个父母。主要的 有用的用例用于 “混入”类:添加特定的 每个类的额外字段或方法 继承了混音。试着保持 你的继承层次结构很简单 尽可能直截了当 你不必努力 找出特定的一块 信息来自。

    来自Django docs

    一般来说,多重继承是个坏主意,而且有更简单的方法来做事。如果您更清楚地说明您要解决的问题,我们可能会提供更好的帮助。

    【讨论】:

    • 感谢您的回复 :) 不过我还是有点困惑 - 编辑了更多关于我的问题以及为什么我开始对此感到疑惑的信息。
    猜你喜欢
    • 2023-03-05
    • 2013-10-21
    • 2013-12-22
    • 2018-03-07
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多