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

Dja*_*oob 5 python django abstract-class django-models models

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

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

每个应用程序的主要信息将相同。每个都有名称、描述等。不同之处在于它们的作用和使用的设置。这些设置在它们自己的模型中,通过外键链接回应用程序。

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

我的问题是,application使用抽象基类模型代理模型声明我的s 有什么区别?

mer*_*t64 7

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

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

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

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

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

根据您的描述,我不是 100% 清楚您的具体用例,但希望我已经给了您足够的信息来决定什么是最好的。