【发布时间】: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