我可以在 django 项目中有一个主模型文件吗?
Can I have a main models file in a django project?
问题
我正在开发一个 Django 项目,我需要在多个应用程序上共享相同的数据库模型,例如,当用户打开一个页面时,该页面的显示取决于用户设置,可以通过用户使用与显示该页面的应用程序不同的应用程序
目前我已经制作了包含我的大部分模型的浏览器应用程序(因为它是我开始使用的那个)我还有其他应用程序,例如 watch_file
和 user_settings
然后导入
这是可行的,但我注意到我 运行 遇到了组织问题,我从一个文件跳到另一个文件来检查模型,并且我正在到处导入...
我的潜在解决方案
我正在考虑在某个地方制作一个大模型文件,然后只在它自己的模型文件中导入每个应用程序所需的模型,但是,我读到 this question 其中有人在评论中说通常这未完成
我还红色 this question 表示在组织方面共享应用程序之间的模型根本不是一个好主意
问题
关于为我的项目正在使用的所有模型创建一个通用模型文件不是一个好主意,我将如何组织它,这样我就不必从不同的文件中导入这么多模型一个应用程序工作?
我可以创建一个类似助手应用程序的东西,它不显示但仅用于帮助其他应用程序,方法是将所有模型都放在它的 models.py
文件中并从此处导入其他应用程序吗?
注意:在下文中谈到 "apps" 时,我指的是 "project-specific apps",而不是 "reusable apps"。
这是完全合法的(技术上)并且在任何重要的项目中都很难避免具有包间依赖性(Django "apps" 是第一个也是最重要的 python 包),所以有一个应用程序导入来自另一个应用程序的模型本身绝对不是问题。问题是当你开始有循环依赖时(A 依赖于 B,B 依赖于 C,C 又依赖于 A...)
通常可以正常工作的模式是拥有一个 "core" 应用程序,所有其他应用程序都可以依赖该应用程序,但不能依赖于任何其他应用程序(当然,contribs 应用程序或第三方应用程序除外),和一个 "main" 可以依赖任何应用但不允许其他应用依赖的应用。核心应用程序为您的项目提供 "foundations" - 所有项目都需要的基本构建块 - 主应用程序(通常根本没有模型)负责 "top-level integration" 一切(IOW它是您将不明确属于另一个应用程序的所有内容和 "bridges" 其他应用程序功能放在一起的地方。
然后,除了对贡献应用、第三方应用和核心应用的依赖外,您会尝试让其他应用大部分保持独立。
另请注意,应用程序不一定具有模型、视图、模板和模板标签等 - 您可以使用定义几个模型或实用程序的简单应用程序,一个 "frontend" 应用程序(某种程度上类似于 "main" 概念上的应用程序)负责所有项目的视图,"api" 应用程序提供 REST api 其他应用程序模型,等等
问题
我正在开发一个 Django 项目,我需要在多个应用程序上共享相同的数据库模型,例如,当用户打开一个页面时,该页面的显示取决于用户设置,可以通过用户使用与显示该页面的应用程序不同的应用程序
目前我已经制作了包含我的大部分模型的浏览器应用程序(因为它是我开始使用的那个)我还有其他应用程序,例如 watch_file
和 user_settings
然后导入
这是可行的,但我注意到我 运行 遇到了组织问题,我从一个文件跳到另一个文件来检查模型,并且我正在到处导入...
我的潜在解决方案
我正在考虑在某个地方制作一个大模型文件,然后只在它自己的模型文件中导入每个应用程序所需的模型,但是,我读到 this question 其中有人在评论中说通常这未完成
我还红色 this question 表示在组织方面共享应用程序之间的模型根本不是一个好主意
问题
关于为我的项目正在使用的所有模型创建一个通用模型文件不是一个好主意,我将如何组织它,这样我就不必从不同的文件中导入这么多模型一个应用程序工作?
我可以创建一个类似助手应用程序的东西,它不显示但仅用于帮助其他应用程序,方法是将所有模型都放在它的 models.py
文件中并从此处导入其他应用程序吗?
注意:在下文中谈到 "apps" 时,我指的是 "project-specific apps",而不是 "reusable apps"。
这是完全合法的(技术上)并且在任何重要的项目中都很难避免具有包间依赖性(Django "apps" 是第一个也是最重要的 python 包),所以有一个应用程序导入来自另一个应用程序的模型本身绝对不是问题。问题是当你开始有循环依赖时(A 依赖于 B,B 依赖于 C,C 又依赖于 A...)
通常可以正常工作的模式是拥有一个 "core" 应用程序,所有其他应用程序都可以依赖该应用程序,但不能依赖于任何其他应用程序(当然,contribs 应用程序或第三方应用程序除外),和一个 "main" 可以依赖任何应用但不允许其他应用依赖的应用。核心应用程序为您的项目提供 "foundations" - 所有项目都需要的基本构建块 - 主应用程序(通常根本没有模型)负责 "top-level integration" 一切(IOW它是您将不明确属于另一个应用程序的所有内容和 "bridges" 其他应用程序功能放在一起的地方。
然后,除了对贡献应用、第三方应用和核心应用的依赖外,您会尝试让其他应用大部分保持独立。
另请注意,应用程序不一定具有模型、视图、模板和模板标签等 - 您可以使用定义几个模型或实用程序的简单应用程序,一个 "frontend" 应用程序(某种程度上类似于 "main" 概念上的应用程序)负责所有项目的视图,"api" 应用程序提供 REST api 其他应用程序模型,等等