如何使 django 项目中的其他应用程序可以使用应用程序模型?
How to make models of app available to other apps in a django project?
创建一个基于 Django 3 的全栈项目似乎是最佳实践(或至少是一种常用方法),该项目使用具有如下结构的项目特定 Django 应用程序(而不是独立的 Django 应用程序)(例如,参考here):
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
)的逻辑工作得很好(例如通过from backend.apps.app2.logic import ...
in app1/logic.py
)。
但是,如果我尝试在 app2 的逻辑中访问 app1 的模型,我会得到 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
。我可以为应用程序实现数据库包装器以允许跨应用程序数据库访问。然而无论如何,这些应用程序都是跨项目的,我想避免这种情况并允许更轻松地访问。我该如何解决这个问题?
__init__.py
中可能会有一些代码甚至在应用程序注册并准备就绪之前就试图访问数据库。因此,如果您在 __init__.py
中有任何代码,请对其进行评论或确保它会在应用程序准备就绪后访问数据库。
创建一个基于 Django 3 的全栈项目似乎是最佳实践(或至少是一种常用方法),该项目使用具有如下结构的项目特定 Django 应用程序(而不是独立的 Django 应用程序)(例如,参考here):
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
)的逻辑工作得很好(例如通过from backend.apps.app2.logic import ...
in app1/logic.py
)。
但是,如果我尝试在 app2 的逻辑中访问 app1 的模型,我会得到 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
。我可以为应用程序实现数据库包装器以允许跨应用程序数据库访问。然而无论如何,这些应用程序都是跨项目的,我想避免这种情况并允许更轻松地访问。我该如何解决这个问题?
__init__.py
中可能会有一些代码甚至在应用程序注册并准备就绪之前就试图访问数据库。因此,如果您在 __init__.py
中有任何代码,请对其进行评论或确保它会在应用程序准备就绪后访问数据库。