Django出现AppRegistryNotReady错误:导入User模型引发应用未加载问题
解决Django的AppRegistryNotReady错误
问题背景
在user_app模块的service.py中导入User模型:
from .models import User
models.py中的User模型定义:
from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): image = models.ImageField(upload_to='profile-image/') send_massege = models.BooleanField(default=True)
settings.py已配置AUTH_USER_MODEL='user_app.User',且user_app已加入INSTALLED_APPS列表。运行项目时触发以下错误:
File "E:\Python\lib\threading.py", line 1009, in _bootstrap_inner self.run() File "E:\Python\lib\threading.py", line 946, in run self._target(*self._args, **self._kwargs) File "E:\Python\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "E:\Python\lib\site-packages\django\core\management\commands\runserver.py", line 115, in inner_run autoreload.raise_last_exception() File "E:\Python\lib\site-packages\django\utils\autoreload.py", line 87, in raise_last_exception raise _exception[1] File "E:\Python\lib\site-packages\django\core\management\__init__.py", line 381, in execute autoreload.check_errors(django.setup)() File "E:\Python\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "E:\Python\lib\site-packages\django\__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "E:\Python\lib\site-packages\django\apps\registry.py", line 91, in populate app_config = AppConfig.create(entry) File "E:\Python\lib\site-packages\django\apps\config.py", line 211, in create mod = import_module(mod_path) File "E:\Python\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "E:\PyProjects\prosite\user_app\apps.py", line 3, in <module> from .tasks import send_activation_notification File "E:\PyProjects\prosite\user_app\tasks.py", line 3, in <module> from .service import send_an File "E:\PyProjects\prosite\user_app\service.py", line 4, in <module> from .models import User File "E:\PyProjects\prosite\user_app\models.py", line 1, in <module> from django.contrib.auth.models import AbstractUser File "E:\Python\lib\site-packages\django\contrib\auth\models.py", line 3, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "E:\Python\lib\site-packages\django\contrib\auth\base_user.py", line 47, in <module> class AbstractBaseUser(models.Model): File "E:\Python\lib\site-packages\django\db\models\base.py", line 108, in __new__ app_config = apps.get_containing_app_config(module) File "E:\Python\lib\site-packages\django\apps\registry.py", line 253, in get_containing_app_config self.check_apps_ready() File "E:\Python\lib\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.
错误原因
从栈追踪可明确问题根源:循环导入+提前加载
apps.py在模块级别直接导入tasks.pytasks.py导入service.pyservice.py导入models.py- 而
models.py依赖的Django auth模型需要在apps初始化完成后才能加载,此时Django还未完成apps的初始化流程,触发AppRegistryNotReady错误。
解决方案
方案1:调整AppConfig的导入时机
修改user_app/apps.py,将tasks的导入移到ready()方法中——该方法会在Django所有apps加载完成后执行:
from django.apps import AppConfig class UserAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'user_app' def ready(self): # 延迟导入tasks,避免在apps初始化阶段触发模型加载 from . import tasks
方案2:将模型/服务导入移到函数内部
如果service.py中的send_an函数才需要用到User模型,把导入语句移到函数内部,而非模块顶部:
# service.py def send_an(...): from .models import User # 后续业务逻辑
同理,tasks.py若仅在任务函数中用到service的方法,也可将导入移到函数内部:
# tasks.py from celery import shared_task @shared_task def send_activation_notification(...): from .service import send_an # 任务执行逻辑
通过以上两种方式,可避免在Django初始化阶段触发模型导入,等到实际执行代码时,apps已完成加载,即可正常使用模型。
内容的提问来源于stack exchange,提问作者Vadim Bagriy
相关产品推荐
相关产品推荐

