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

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.py
  • tasks.py导入service.py
  • service.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:31:15