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



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

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

每个应用程序的主要信息将是相同的。每个都将有一个名称、描述等。区别在于它们执行的操作和使用哪些设置。不过,这些设置在它们自己的模型中,并通过外键链接返回到应用程序。

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

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

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

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

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

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

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

根据您的描述,我不是 100% 清楚您的特定用例,但希望我已经为您提供了足够的信息来决定您自己最好的方法。

最新更新