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

时间:2018-03-13 12:44:09

标签: python django django-models abstract-class models

我正在构建一个控件面板,它将在Django中有多个子应用程序。我的一个模型是application,其中包含namedescriptioninstall_pathid等重要设置(以便我可以关联特定设置和此应用程序的配置值。

现在我正试图弄清楚如何宣布这个特定的模型。每个application将执行与其他应用程序完全不同的操作。可以管理特定的CMS设置,另一个可以处理我们的开发环境的密码重置。目标是在一个地方获得共同支持项目。

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

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

我的问题是,使用abstract base class modelsproxy models声明application之间的区别是什么?

1 个答案:

答案 0 :(得分:1)

8个月没有人碰过。我应该知道得更多,但是我会对此采取行动。

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

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

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

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

根据您的描述,我不清楚您的特定用例是否是100%清楚的,但希望我能给您足够的信息来决定最适合您自己的情况。