Django跨应用共享模型触发AppRegistryNotReady错误求助
解决Django Plotly Dash跨应用导入模型触发AppRegistryNotReady错误
问题场景
我的Django项目结构如下:
myproject/ - apps/ - app1/ - app2/
运行python manage.py runserver时一切正常,但在app2中导入app1的模型后,立即触发错误:django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
导入代码如下:
# myproject/apps/app2/callback_funcs/sub_functions.py from apps.app1.models import SharedDataModel
已尝试的无效方案
- 所有应用均已加入
INSTALLED_APPS,移除上述导入语句后项目可正常运行 - 调整
INSTALLED_APPS中应用顺序,无任何改善
当前INSTALLED_APPS配置:
INSTALLED_APPS = [ ... 'apps.app1', 'apps.app2.app', ... ]
补充背景
- app1是标准Django应用,app2是基于Django Plotly Dash的应用,其
app.py内容:
# myproject/apps/app2/app.py from django_plotly_dash import DjangoDash from .layout import layout from .callbacks import register_callbacks app = DjangoDash("app2") app.layout = layout register_callbacks(app)
- 将该模型导入非Django Plotly Dash应用时无错误,推测问题源于该库的初始化逻辑
运行环境:Python 3.9.16、Django 3.2.16、Django Plotly Dash 2.1.3
完整报错回溯
Exception in thread django-main-thread: Traceback (most recent call last): File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/threading.py", line 980, in _bootstrap_inner self.run() File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/threading.py", line 917, in run self._target(*self._args, **self._kwargs) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run autoreload.raise_last_exception() File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception raise _exception[1] File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/core/management/__init__.py", line 375, in execute autoreload.check_errors(django.setup)() File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/apps/registry.py", line 91, in populate app_config = AppConfig.create(entry) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/apps/config.py", line 224, in create import_module(entry) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1030, in _gcd_import File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "/home/ubuntu/GitHub/myproject/apps/app2/sub_module.py", line 3, in <module> from .callbacks import register_callbacks File "/home/ubuntu/GitHub/myproject/apps/app2/callbacks.py", line 11, in <module> from .callback_funcs import sub_funcs File "/home/ubuntu/GitHub/myproject/apps/app2/callback_funcs/sub_funcs.py", line 5, in <module> from apps.app1.models import SharedDataModel File "/home/ubuntu/GitHub/myproject/apps/app1/models.py", line 8, in <module> class SharedDataModel(models.Model): File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/db/models/base.py", line 108, in __new__ app_config = apps.get_containing_app_config(module) File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/apps/registry.py", line 253, in get_containing_app_config self.check_apps_ready() File "/home/ubuntu/miniconda3/envs/myproject/lib/python3.9/site-packages/django/apps/registry.py", line 136, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
解决方案
方案1:延迟导入模型到回调函数内部
问题根源是Django Plotly Dash的应用初始化逻辑会在Django app registry完全加载前触发回调模块的导入,导致模型导入时机过早。
修改步骤:
- 移除
sub_functions.py顶部的模型导入语句 - 在需要使用模型的回调函数内部进行导入:
# myproject/apps/app2/callback_funcs/sub_functions.py def my_callback_function(input_value): # 延迟导入,直到Django应用完全加载 from apps.app1.models import SharedDataModel # 后续使用SharedDataModel的逻辑 data = SharedDataModel.objects.filter(...) return data
方案2:调整Django Plotly Dash的初始化时机
如果延迟导入不符合你的代码结构,可以修改app2的初始化逻辑,确保其在Django应用完全加载后执行:
- 创建app2的
apps.py文件(如果不存在):
# myproject/apps/app2/apps.py from django.apps import AppConfig class App2Config(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.app2' def ready(self): # 在这里初始化Django Dash应用和注册回调 from django_plotly_dash import DjangoDash from .layout import layout from .callbacks import register_callbacks app = DjangoDash("app2") app.layout = layout register_callbacks(app)
- 修改
INSTALLED_APPS中的配置,将'apps.app2.app'替换为'apps.app2.apps.App2Config':
INSTALLED_APPS = [ ... 'apps.app1', 'apps.app2.apps.App2Config', ... ]
- 删除原
app2/app.py文件,避免重复初始化
这样能确保回调和模型导入都在Django应用完全加载后执行。
内容的提问来源于stack exchange,提问作者hubbs5
相关产品推荐
相关产品推荐

