Django中的抽象基类模型与代理模型

Posted

技术标签:

【中文标题】Django中的抽象基类模型与代理模型【英文标题】:Abstract base class model vs Proxy model in Django 【发布时间】:2018-08-21 17:34:14 【问题描述】:

我正在构建一个控制面板,它将在 Django 中包含多个子应用程序。我的一个模型是application,它将具有重要的设置,例如namedescriptioninstall_pathid(这样我就可以将特定设置和配置值与此应用程序相关联。

现在我正在努力弄清楚如何声明这个特定的模型。每个application 都会做一些与其他应用程序完全不同的事情。一个可以管理特定的 CMS 设置,另一个可以为我们的开发环境处理密码重置。目标是将通用支持项目集中到一个地方。

每个应用程序的主要信息都是相同的。每个都有一个名称、描述等。不同之处在于他们做什么以及他们使用什么设置。不过,这些设置在它们自己的模型中,并通过外键链接回应用程序。

我不确定哪种模型类型最适合我的用例。两者看起来都很有用,但如果是这样的话,我假设我缺少其中一个(或两个)的一个方面。

我的问题是,使用abstract base class models 和proxy models 声明我的applications 有什么区别?

【问题讨论】:

【参考方案1】:

8 个月来没有人碰过这个。我应该知道得更好,但我要试一试。

显然,您的第一个选择是根本不使用基类并在每个模型上复制您的字段。我知道您没有问过这个问题,但对于其他查看这篇文章的人来说,这是初学者的好方法。这很简单,模型的所有内容都列在一个位置,而不是指向位于某些字段代码中其他位置的另一个模型。

抽象基类可能是最简单和最常用的。当您在两个或多个模型中有大量重复字段时,值得考虑。使用这种方法,您可以消除在多个模型中一遍又一遍地键入(或剪切和粘贴)字段的需要。当您声明基类抽象时,该表从未真正构建在数据库中。基类仅在构建子表时使用。这使您的数据库更简单并保持性能,因为您不必建立与基类的关系并使用连接来查询数据。您还可以向每个子模型(代理模型不能)上的子类添加其他字段(属性)。

代理模型有些相似之处在于您有一个基类或父类,但两者之间存在显着差异。您将在所有模型具有相同字段(属性)但您可能具有不同“类型”对象的情况下使用代理模型。例如,您可能有一个 Cars 基类,并使用制造商作为您的类型。然后你可能有福特、雪佛兰和本田车型,它们都是汽车的代理车型。它们都有相同的字段。为模型选择的经理类是真正使它们彼此不同的原因。从数据库的角度来看,实际上只构建了一个表...... Cars,比构建多个表具有更好的性能,但缺点是您无法将特定于制造商的字段添加到模型中而不将它们添加到整个 Cars 表中。

一般来说,对于具有大量重复字段的模型,我建议从抽象基类开始。代理模型似乎是一个更具体的用例,但如果你有用例并且一旦你更加精通,也可以使用它。

根据您的描述,我不是 100% 清楚您的具体用例,但希望我已经为您提供了足够的信息来决定什么是您自己的最佳选择。

【讨论】:

以上是关于Django中的抽象基类模型与代理模型的主要内容,如果未能解决你的问题,请参考以下文章

django 抽象模型与常规继承

Django 中的抽象模型和外键

如何将 Django 信号与抽象模型一起使用?

Python / Django中多个抽象模型继承中的字段菱形模式

Django模型与多个模型的关系

Django的元选项