You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完全加载前触发回调模块的导入,导致模型导入时机过早。

修改步骤:

  1. 移除sub_functions.py顶部的模型导入语句
  2. 在需要使用模型的回调函数内部进行导入:
# 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应用完全加载后执行:

  1. 创建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)
  1. 修改INSTALLED_APPS中的配置,将'apps.app2.app'替换为'apps.app2.apps.App2Config':
INSTALLED_APPS = [
...
'apps.app1',
'apps.app2.apps.App2Config',
...
]
  1. 删除原app2/app.py文件,避免重复初始化

这样能确保回调和模型导入都在Django应用完全加载后执行。

内容的提问来源于stack exchange,提问作者hubbs5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:25:19