假设我有三个django模型类 - 让我们称它们为A,B和C.如果A和B是抽象的,我可以做类似的事情:
class C(A,B):
pass
如果它们不是抽象的我会做同样的事情呢?一切都会正常或不正常吗?或者我弄错了,这也不应该用抽象模型来完成?
我遇到了一些问题,我认为答案可能不是,但如果有人知道,我仍然更愿意确认这一点:) 我对此的具体用例可能更好地由Generic Relations提供(我最近才发现它们的存在),所以我想如果Django团队做出这样的设计决定(我看不见)是可以理解的很多人需要这样做)。我只想知道案件是什么。
有趣......我们遇到的问题是类似于IMDb的结构(我认为IMDb比我们实际拥有的主题更容易理解,因此我将以它们为例)。在IMDb上,他们有人物页面和电影页面,人物和电影都有自己的留言板。
我们最终通过创建一个名为MessageboardOwner的模型(只有一个属性 - 由Django自动添加的ID)将留言板连接到人物和电影,“拥有”留言板,人和电影继承它。问题是我们的“People”类还继承了另外两个类。类定义类似于:
class Person(A,B,MessageboardOwner):
最初这似乎很好,但今天发生了一些相当奇怪的事情......我正在删除管理员中的一个人,管理员问“你确定吗?”问题,并向我展示了它必须删除的其他对象。它试图删除两个留言板,而不是一个。其中一个留言板应该由电影拥有,而不是人。
在查看数据库中究竟是什么时,我发现此Person实例使用的是与Movie相同的MessageboardOwner实例。当我玩它时,出现的是Movie类,它只在MessageboardOwner之后继承,似乎工作正常。但是,保存Person只会创建一个MessageboardOwner对象(如果尚未存在)(或者可能覆盖现有对象 - 我不确定)。我还发现从A,B和MessageboardOwner继承的id字段总是相等的,这对我来说很奇怪。
答案 0 :(得分:2)
是的,您可以将普通的Python多重继承与模型一起使用。但要记住这个警告:
就像Python的子类一样, Django模型有可能实现 从多个父模型继承。 请记住,普通的Python名称 解决规则适用。第一个基地 一个特定名称的类(例如 Meta)出现在那将是那个 用来;例如,这意味着 如果多个父母包含Meta 上课,只有第一个去 使用,所有其他人将 忽略。
通常,您不需要继承 来自多个父母。主要的 有用的用例是 “混合”类:添加一个特定的 每个班级的额外字段或方法 继承了混合。尽量保持 你的继承层次结构很简单 尽可能直截了当 你不必挣扎 找出一块特定的地方 信息来自。
来自Django docs。
通常,多重继承是一个坏主意,并且有更简单的方法可以做。如果你更清楚地解决了你想要解决的问题,我们可以帮助你做得更好。