gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:18:28 25 4
gpt4 key购买 nike

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

class C(A,B):
pass

如果它们不是抽象的并且我也这样做怎么办?一切是否仍能正常工作?或者我弄错了,这也不应该用抽象模型来完成?

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

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

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

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

class Person(A,B,MessageboardOwner):

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

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

最佳答案

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

Just as with Python's subclassing, it's possible for a Django model to inherit from multiple parent models. Keep in mind that normal Python name resolution rules apply. The first base class that a particular name (e.g. Meta) appears in will be the one that is used; for example, this means that if multiple parents contain a Meta class, only the first one is going to be used, and all others will be ignored.

Generally, you won't need to inherit from multiple parents. The main use-case where this is useful is for "mix-in" classes: adding a particular extra field or method to every class that inherits the mix-in. Try to keep your inheritance hierarchies as simple and straightforward as possible so that you won't have to struggle to work out where a particular piece of information is coming from.

来自 Django docs .

一般来说,多重继承不是一个好主意,并且有更简单的方法可以做到这一点。如果您更清楚地说明您想要解决的问题,我们也许能够提供更好的帮助。

关于python - Django 是否支持在许多非抽象模型之后继承的模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com