将模型与应用程序的其余部分分离是一种良好的编程实践吗?

6
我的项目由几个django应用程序组成,需要有不同的部署方式,可能在不同的机器上。然而,这些应用程序偶尔需要访问彼此的模型,因此我考虑“外部化”我的模型,以便它们可以更优雅地从任何应用程序中访问。所以想法是创建一个类似于以下结构的目录:
```html ```
/ 
+ application1
+ application2
+ models

除了代码可维护性之外,这样做还有实际的功能点吗?因为这些应用程序可以相互交叉引用。


1
很难说。你能想到什么缺点吗?如果所有模型混在一个文件夹中,会不会变得混乱不清? - dqhendricks
1
@dqhendricks:不,实际上这样做可能会更容易管理,因为我们将拥有一个数据库接口的单一焦点... - Goro
1
应用程序内的模型之间可以很好地相互依赖。为什么要尝试提取模型?什么是“更优雅”?from app.models import This, That看起来已经非常优雅了。你怎么能进一步改进呢? - S.Lott
@S.Lott:没错。只是现在似乎出现了一些碎片化的情况,应用程序拥有自己的模型,这些模型仅描述数据库模式的部分内容。 - Goro
1
@Goro:分段?我们称之为“主题领域”,用它们将复杂的问题分解成更小、相关、更简单的问题。把大问题分解成小问题有什么问题吗? - S.Lott
显示剩余2条评论
3个回答

4
以下是对django书中的以下段落的翻译,使我认为这可能不是一个好主意(我添加了粗体格式):

然而,有一个关于应用程序约定的要求:如果您使用Django的数据库层(models),则必须创建Django应用程序。模型必须位于应用程序内。因此,为了开始编写我们的模型,我们需要创建一个新的应用程序。


1
你如何从这句话中推断出模型需要存在于它们被使用的同一个应用程序中?难道不能只有一个模型应用程序吗? - aaronasterling
法律的字面意思有时与其背后的精神不同。可能会有一个包含所有模型的模型应用程序。重点是要避免将所有内容都放在一个庞大的应用程序中。但是,你当然可以拥有一个包含所有模型的应用程序,而所有其他应用程序只是视图函数的集合。但这并不符合Django的精神 - S.Lott

3
下面的内容不适合放在 @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)

2

我认为这不是一个特别好的想法,虽然我能理解它的吸引力。如果你只想安装一个应用程序,那么你将包含很多你不使用的模型。我认为最好将模型保留在它们最相关的应用程序中。

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


不错的观点,但我认为如果做得当,这将使事情更整洁:如果我们将所有模型移动到它们自己的应用程序中,那么我们就可以在该应用程序上只有一个管理界面,囊括了所有的模型。 - Goro

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