如何使应用程序模型可用于 django 项目中的其他应用程序?
Posted
技术标签:
【中文标题】如何使应用程序模型可用于 django 项目中的其他应用程序?【英文标题】:How to make models of app available to other apps in a django project? 【发布时间】:2020-05-10 17:44:16 【问题描述】:创建一个基于 Django 3 的全栈项目似乎是最佳实践(或至少一种常用方法),该项目使用具有此类结构的项目特定 Django 应用程序(而不是独立的 Django 应用程序)(请参阅例如 @987654321 @):
fullstack_project/
frontend/
... # frontend stuff goes into here
backend/ # Django project name
apps/
app1/
apps.py
logic.py
models.py
...
app2/
apps.py
logic.py
models.py
...
wsgi.py
...
manage.py
应用程序(此处:app1
)通过fullstack_project/backend/apps/app1/apps.py
以最基本的形式(没有规则、视图等)集成
class App1Config(AppConfig):
name = 'backend.apps.app1'
和fullstack_project/backend/settings.py
INSTALLED_APPS = [
...
'backend.apps.app1.apps.App1Config',
'backend.apps.app2.apps.App2Config',
]
在另一个应用程序(例如app1/logic.py
)中使用一个应用程序的逻辑(例如app2/logic.py
)可以正常工作(例如通过app1/logic.py
中的from backend.apps.app2.logic import ...
)。
但是,如果我尝试在 app2 的逻辑中访问 app1 的模型,我会得到 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
。我可以为应用程序实现数据库包装器以允许跨应用程序数据库访问。但是无论如何,这些应用程序都是跨项目的,我想避免这种情况并更轻松地允许访问。我该如何解决这个问题?
【问题讨论】:
您是否在设置的已安装应用程序中添加了这两个应用程序 是的。我改进了这个问题。 您是否在__init__.py
的应用程序中执行任何功能,如果有,请评论和检查
@PavanKumarTS 是的,我错过了删除其中一个应用程序的__init__.py
中的调试代码。如果您提供您的评论作为答案,我会接受它。谢谢!
【参考方案1】:
__init__.py
中可能会有一些代码在应用注册并准备好之前尝试访问数据库。因此,如果您在__init__.py
中有任何代码,请对其进行评论或确保一旦应用程序准备好它就会访问数据库。
【讨论】:
删除 init.py 中的代码是解决方案。但是代码没有访问数据库(包含代码的应用程序 init.py 根本没有模型)。以上是关于如何使应用程序模型可用于 django 项目中的其他应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据库中的 Django 模型实例“腌制”到可用于加载示例数据的示例 python 代码中?
如何使通过多对多关系连接的模型在 Django admin 中同时在两个地方可编辑?