Django报错Apps aren't loaded yet(__init__.py中导入了尚未加载的东西)

本文深入解析了在使用Django框架时遇到的AppRegistryNotReady错误,详细阐述了错误出现的原因及解决步骤。核心在于避免在__init__.py文件中提前导入models模块,遵循Django的应用加载流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

现象:无论是执行runserver还是migrate等命令,均出现以上的错误信息。

问题原因:应用的路径下的__init__.py中写下了import models的内容。

 

Django文档中对applications加载的描述:

django.setup()负责application注册表的初始化

application注册表的初始化需要三个过程,

第一个过程是从INSTALLED_APP中导入每一个内容,这个过程中代码不应该导入任何models,即使是间接的导入。
第二个过程Django尝试导入models中的子模块,并且必须通过models.py和models/__init__.py
第三个过程是调用每个application的ready()方法

 

特别感谢https://www.liangzl.com/get-article-detail-1704.html分享的解决方法

python manage.py migrate Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in main execute_from_command_line(sys.argv) File "/root/oscar/lib/python3.8/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line utility.execute() File "/root/oscar/lib/python3.8/site-packages/django/core/management/__init__.py", line 382, in execute settings.INSTALLED_APPS File "/root/oscar/lib/python3.8/site-packages/django/conf/__init__.py", line 102, in __getattr__ self._setup(name) File "/root/oscar/lib/python3.8/site-packages/django/conf/__init__.py", line 89, in _setup self._wrapped = Settings(settings_module) File "/root/oscar/lib/python3.8/site-packages/django/conf/__init__.py", line 217, in __init__ mod = importlib.import_module(self.SETTINGS_MODULE) File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 848, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/root/oscar/frobshop/frobshop/settings.py", line 188, in <module> path('admin/', admin.site.urls), File "/root/oscar/lib/python3.8/site-packages/django/utils/functional.py", line 266, in inner self._setup() File "/root/oscar/lib/python3.8/site-packages/django/contrib/admin/sites.py", line 595, in _setup AdminSiteClass = import_string(apps.get_app_config("admin").default_site) File "/root/oscar/lib/python3.8/site-packages/django/apps/registry.py", line 156, in get_app_config self.check_apps_ready() File "/root/oscar/lib/python3.8/site-packages/django/apps/registry.py", line 138, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
06-14
Traceback (most recent call last): File "D:\hyx_medical\manage.py", line 11, in <module> from backend.models import ImageTask File "D:\hyx_medical\backend\models.py", line 2, in <module> from django.contrib.auth.models import User File "D:\Miniconda3\envs\523\lib\site-packages\django\contrib\auth\models.py", line 3, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "D:\Miniconda3\envs\523\lib\site-packages\django\contrib\auth\base_user.py", line 57, in <module> class AbstractBaseUser(models.Model): File "D:\Miniconda3\envs\523\lib\site-packages\django\db\models\base.py", line 129, in __new__ app_config = apps.get_containing_app_config(module) File "D:\Miniconda3\envs\523\lib\site-packages\django\apps\registry.py", line 260, in get_containing_app_config self.check_apps_ready() File "D:\Miniconda3\envs\523\lib\site-packages\django\apps\registry.py", line 138, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. PS D:\hyx_medical> python manage.py runserver Traceback (most recent call last): File "D:\hyx_medical\manage.py", line 11, in <module> from backend.models import ImageTask File "D:\hyx_medical\backend\models.py", line 2, in <module> from django.contrib.auth.models import User File "D:\Miniconda3\envs\523\lib\site-packages\django\contrib\auth\models.py", line 3, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "D:\Miniconda3\envs\523\lib\site-packages\django\contrib\auth\base_user.py", line 57, in <module> class AbstractBaseUser(models.Model): File "D:\Miniconda3\envs\523\lib\site-packages\django\db\models\base.py", line 129, in __new__ app_config = apps.get_containing_app_config(module) File "D:\Miniconda3\envs\523\lib\site-packages\django\apps\registry.py", line 260, in get_containing_app_config self.check_apps_ready() File "D:\Miniconda3\envs\523\lib\site-packages\django\apps\registry.py", line 137, in check_apps_ready settings.INSTALLED_APPS File "D:\Miniconda3\envs\523\lib\site-packages\django\conf\__init__.py", line 102, in __getattr__ self._setup(name) File "D:\Miniconda3\envs\523\lib\site-packages\django\conf\__init__.py", line 82, in _setup raise ImproperlyConfigured( django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
最新发布
06-17
Django 架构中,一般使用 Django 自带的 ORM(Object-Relational Mapping)来操作数据库。ORM 是一种将关系数据库中的数据映射到对象的技术,将程序中的对象转换为数据库中的记录,从而实现对数据库的操作。 不过,如果你想直接使用 MySQL Connector/Python 驱动来连接 MySQL 数据库,可以在 Django 项目中的 `__init__.py` 文件中进行相关配置。具体配置如下: 1. 安装 MySQL Connector/Python 驱动,可以使用 pip 命令进行安装: ``` pip install mysql-connector-python ``` 2.Django 项目的 `__init__.py` 文件中添加以下代码: ```python import mysql.connector from django.db.backends.mysql.base import DatabaseWrapper # 定义 MySQL Connector/Python 驱动的数据库连接参数 cnx = mysql.connector.connect(user='your_username', password='your_password', host='your_host', database='your_database') # 重写 Django 的 MySQL 数据库连接方法 class MySQLDatabaseWrapper(DatabaseWrapper): def get_new_connection(self, conn_params): return cnx # 注册 MySQLDatabaseWrapper DatabaseWrapper.register_backend('mysql.connector', 'django.db.backends.mysql.base', 'MySQLDatabaseWrapper') ``` 需要将上述代码中的 `your_username`、`your_password`、`your_host` 和 `your_database` 替换为实际的数据库连接参数。 3.Django 项目的 `settings.py` 文件中,将 `DATABASES` 配置中的 `ENGINE` 改为 `django.db.backends.mysql.connector`,如下所示: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql.connector', 'NAME': 'your_database', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'your_host', 'PORT': 'your_port', } } ``` 需要将上述代码中的 `your_username`、`your_password`、`your_host`、`your_database` 和 `your_port` 替换为实际的数据库连接参数。 这样,就可以在 Django 项目中使用 MySQL Connector/Python 驱动来连接 MySQL 数据库了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值