将模型与应用程序的其余部分分开是一种好的编程习惯吗

Posted

技术标签:

【中文标题】将模型与应用程序的其余部分分开是一种好的编程习惯吗【英文标题】:Is it a good programming practice to separate models from the rest of the application 【发布时间】:2012-02-08 08:28:22 【问题描述】:

我的项目由几个 django 应用程序组成,它们需要以不同的方式部署,可能在不同的机器上。然而,这些应用程序经常偶尔需要访问彼此的模型,所以我正在考虑“外部化”我的模型,以便可以从任何应用程序更优雅地访问它们。所以我们的想法是要有类似这样的目录结构:

/ 
+ application1
+ application2
+ models

由于应用程序可以相互交叉引用,这样做是否有功能点(代码可维护性除外)?

【问题讨论】:

很难说。你能想到缺点吗?会不会混淆混入一个文件夹中的所有模型? @dqhendricks:不,不是。事实上,它可能会更容易管理,因为我们将有一个单一的数据库接口焦点...... 模型应用内可以很好地相互依赖。为什么要尝试提取模型?什么是“更优雅”? from app.models import This, That 看起来很优雅。您如何改进这一点? @S.Lott:确实如此。似乎发生了一些碎片化,应用程序拥有自己的模型,这些模型仅描述数据库架构的一部分。 @Goro:碎片化?我们将这些称为“主题领域”,并使用它们将复杂问题分解为更小、相关、更简单的问题。把大问题分解成小问题有什么问题? 【参考方案1】:

django book 中的以下段落让我觉得这可能不是一个好主意(我添加了粗体格式):

但是,对于应用程序约定有一个要求:如果您使用 Django 的数据库层(模型),则必须创建一个 Django 应用程序。 模型必须存在于应用中。因此,为了开始编写我们的模型,我们需要创建一个新应用程序。

【讨论】:

您如何从引用中推断出模型需要存在于使用它们的相同应用程序中?不能只有模型应用吗? 法律条文有时与其背后的精神不同。可能有一个模型应用程序,其中包含一个模型模型,其中包含所有模型。关键是要避免使用包含所有内容的单一怪物应用程序。但。当然,您可以拥有一个包含所有模型的应用程序,而所有其他应用程序只是视图函数的集合。但这不是 Django 的精神【参考方案2】:

以下内容不太适合 @jcollado 的回答,所以我将其放在这里:

https://docs.djangoproject.com/en/dev/topics/db/models/#models-across-files

跨文件的模型

将模型与另一个应用程序中的模型相关联是完全可以的。为此,请在包含您的模型的模型顶部导入相关模型。然后,只需在需要的地方引用其他模型类。例如:

from geography.models import ZipCode

class Restaurant(models.Model):
    # ...
    zip_code = models.ForeignKey(ZipCode)

【讨论】:

【参考方案3】:

我不认为这是一个特别好的主意,尽管我可以看到它的吸引力。如果您只想安装一个应用程序,您将包含许多您不使用的模型。我认为最好将模型保留在与它们最相关的应用中。

这也可能使管理界面的使用更加混乱。您在哪里向管理员注册模型?您在哪里为模型进行管理员自定义?

【讨论】:

好点子,但我认为如果处理得当,它会让事情变得更整洁:如果我们将所有模型移动到他们自己的应用程序中,那么我们可以让管理员在 that i> 应用程序,包含所有模型。

以上是关于将模型与应用程序的其余部分分开是一种好的编程习惯吗的主要内容,如果未能解决你的问题,请参考以下文章

将 realloc() 返回的地址分配给同一个指针是一种好的编码习惯吗?

大量使用静态成员变量是一种好习惯吗? [复制]

在将项目部署到服务器之前重置所有迁移是一种好习惯吗?

为啥捕获 RuntimeException 不被认为是一种好的编程习惯? [关闭]

使用 if(...) 时,为啥这被认为是一种好的编程习惯? [复制]

为模型创建许多 DTO 是一种好习惯吗?