Django是否支持在许多非抽象模型之后继承的模型类?

时间:2009-12-16 18:07:10

标签: python django django-models

假设我有三个django模型类 - 让我们称它们为A,B和C.如果A和B是抽象的,我可以做类似的事情:

class C(A,B):
    pass

如果它们不是抽象的我会做同样的事情呢?一切都会正常或不正常吗?或者我弄错了,这也不应该用抽象模型来完成?

我遇到了一些问题,我认为答案可能不是,但如果有人知道,我仍然更愿意确认这一点:) 我对此的具体用例可能更好地由Generic Relations提供(我最近才发现它们的存在),所以我想如果Django团队做出这样的设计决定(我看不见)是可以理解的很多人需要这样做)。我只想知道案件是什么。

编辑1(在Dominic回答之后)

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

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

class Person(A,B,MessageboardOwner):

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

在查看数据库中究竟是什么时,我发现此Person实例使用的是与Movie相同的MessageboardOwner实例。当我玩它时,出现的是Movie类,它只在MessageboardOwner之后继承,似乎工作正常。但是,保存Person只会创建一个MessageboardOwner对象(如果尚未存在)(或者可能覆盖现有对象 - 我不确定)。我还发现从A,B和MessageboardOwner继承的id字段总是相等的,这对我来说很奇怪。

1 个答案:

答案 0 :(得分:2)

是的,您可以将普通的Python多重继承与模型一起使用。但要记住这个警告:

  

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

     

通常,您不需要继承   来自多个父母。主要的   有用的用例是   “混合”类:添加一个特定的   每个班级的额外字段或方法   继承了混合。尽量保持   你的继承层次结构很简单   尽可能直截了当   你不必挣扎   找出一块特定的地方   信息来自。

来自Django docs

通常,多重继承是一个坏主意,并且有更简单的方法可以做。如果你更清楚地解决了你想要解决的问题,我们可以帮助你做得更好。