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

7
我正在构建一个控制面板,其中包含多个Django子应用程序。我的一个模型是一个application,它将具有重要的设置,如namedescriptioninstall_pathid(以便我可以将特定的设置和配置值与此应用程序关联)。
现在我正在努力尝试弄清楚如何声明这个特定的模型。每个application都会执行完全不同于其他应用程序的操作。一个可能管理特定的CMS设置,另一个可能处理我们开发环境的密码重置。目标是将常见的支持项放在一个地方。
每个应用程序的主要信息将是相同的。每个应用程序都有名称、描述等。不同之处在于它们的功能和使用的设置。但设置在它们自己的模型中,并通过外键链接回应用程序。
我不确定哪种模型类型最适合我的用例。两者看起来都很有用,但如果是这样的话,我认为我可能会错过其中一个(或两个)方面。

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

1个回答

15

这已经有8个月没人动过了。虽然我应该更明智,但我还是要试一试。

显然,你的第一个选择是完全不使用基类,并在每个模型上复制你的字段。我知道你没有询问这个,但对于其他查看此张贴的人来说,这是初学者的好方法。它很容易,而且模型的所有内容都列在一个地方,而不是指向代码中其他地方的另一个模型来处理某些字段。

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

代理模型与基础或父类相似,但从那里开始有显著的差异。在所有模型具有相同字段(属性)但可能具有不同"类型"的对象的情况下,将使用代理模型。例如,您可能有一个汽车的基础类,并将制造商作为您的类型。然后,您可能会拥有福特,雪佛兰和本田车型,它们都是汽车的代理模型。它们都具有相同的字段。所选的模型管理器才是使它们彼此不同的真正原因。从数据库的角度来看,实际上只建立了一张表... Cars,这比建立多个表要更有效率,但缺点是如果要将制造商特定字段添加到模型中,则必须将其添加到整个Cars表中。

通常,我建议对于具有大量重复字段的模型,请从抽象基类开始。代理模型似乎是更具体的用例,但如果您有使用案例并且掌握更多知识,则也可以使用它们。

根据您的描述,我不完全清楚您的特定用例,但希望我给您足够的信息,以便自行决定最佳方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接