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

Django写入SQL记录时触发配置错误,求原因及解决办法

问题描述

调用load_data()函数写入数据库记录时,触发如下错误:

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.

但运行crud_ops.py中的函数时,却能正常完成数据库记录的写入操作。相关代码文件如下:

load_data.py

def publisher_data(listt, start):
    from reviews.models import Publisher
    check_list = []
    query_list = []

    for i in range(start + 1, len(listt)):
        if listt[i].__contains__("publisher"):
            check_list.append(listt[i])
        else:
            query_list.append(listt[i])

        if len(query_list) == len(check_list):
            print(query_list)
            publisher = Publisher(name=query_list[0], website=query_list[1],
                                  email=query_list[2])
            publisher.save()

            query_list = []
        if listt[i].__contains__("content"):
            break

def load_data():

   file_read = open("WebDevWithDjangoData.csv", "r")
   text = file_read.read().split(",")
   new_list = [x for x in text if x.strip() != '']
   list_1 = []
   start_index = None
   end_index = None
   for x in new_list:
       list_1.append(x.strip())
   file_read.close()


  for x in range(len(list_1)):
       #print(list_1[x])
       if list_1[x] == "content:Publisher":
          start_index = x
          publisher_data(list_1, start_index)

crud_ops.py

def crud_ops():
    from reviews.models import Publisher, Contributor
    publisher = Publisher(name='Packt Publishing', website='https://www.packtpub.com', email='info@packtpub.com')
    publisher.save()
    publisher.email = 'customersupport@packtpub.com'
    publisher.save()
    print(publisher.email)
    contributor = Contributor.objects.create(first_names="Rowel", last_names="Atienza",
                                             email="RowelAtienza@example.com")
    print(contributor)
    print('\n>>> END <<<')

manage.py

import os
import sys
from crud_ops import *



def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookr.settings')
    try:
    from django.core.management import execute_from_command_line
except ImportError as exc:
    raise ImportError(
        "Couldn't import Django. Are you sure it's installed and "
        "available on your PYTHONPATH environment variable? Did you "
        "forget to activate a virtual environment?"
    ) from exc
execute_from_command_line(sys.argv)
crud_ops()


 if __name__ == '__main__':
  main()

settings.py

from pathlib import Path
import os
BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'secret'
DEBUG = True

ALLOWED_HOSTS = []
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'reviews'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'bookr.urls'
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, "templates")],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]
WSGI_APPLICATION = 'bookr.wsgi.application'
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': BASE_DIR / 'db.sqlite3',
}
}
AUTH_PASSWORD_VALIDATORS = [
{
    'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True
STATIC_URL = '/static/'
解决方案

问题根源

crud_ops()能正常运行是因为它在manage.py的main()函数里被调用,而main()已经设置了DJANGO_SETTINGS_MODULE环境变量,且执行了execute_from_command_line完成了Django环境的初始化。但load_data()的调用场景中,Django的配置环境未被加载,导致访问模型时触发配置错误。

解决办法

方法1:手动初始化Django环境(快速解决)

在load_data.py的最顶部添加以下代码,确保在导入模型前完成Django环境初始化:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookr.settings')
django.setup()

调整后的load_data.py开头示例:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookr.settings')
django.setup()

def publisher_data(listt, start):
    from reviews.models import Publisher
    # 剩余代码保持不变

方法2:改为Django自定义命令(推荐,符合Django规范)

  1. 在reviews应用目录下创建management/commands文件夹(若不存在),确保每个目录都有__init__.py空文件。
  2. 在commands目录下新建load_data.py,内容如下:
from django.core.management.base import BaseCommand
from reviews.models import Publisher

class Command(BaseCommand):
    help = '从CSV文件加载出版社数据到数据库'

    def handle(self, *args, **options):
        # 原load_data()的逻辑
        file_read = open("WebDevWithDjangoData.csv", "r")
        text = file_read.read().split(",")
        new_list = [x for x in text if x.strip() != '']
        list_1 = [x.strip() for x in new_list]
        file_read.close()

        for x in range(len(list_1)):
            if list_1[x] == "content:Publisher":
                start_index = x
                self.publisher_data(list_1, start_index)

    def publisher_data(self, listt, start):
        check_list = []
        query_list = []

        for i in range(start + 1, len(listt)):
            if "publisher" in listt[i]:
                check_list.append(listt[i])
            else:
                query_list.append(listt[i])

            if len(query_list) == len(check_list):
                print(query_list)
                publisher = Publisher(name=query_list[0], website=query_list[1], email=query_list[2])
                publisher.save()
                query_list = []
            if "content" in listt[i]:
                break
  1. 在项目根目录执行命令运行:
python manage.py load_data

方法3:在manage.py中调用load_data()

和crud_ops()一样,在manage.py中导入并调用load_data(),利用manage.py已初始化的Django环境:
修改manage.py的main()函数:

def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookr.settings')
    try:
        from django.core.management import execute_from_command_line
        from load_data import load_data  # 添加导入
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)
    crud_ops()
    load_data()  # 添加调用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:07:51