我试图获取JSON对象列表,将它们转换为Python dicts,然后使用每个Python dicts的对象填充Concert模型。
import json
from models import Concert
with open('output.json') as f:
data = json.load(f)
for concert in data:
Concert.objects.create(**concert)
我收到了以前没见过的错误信息:
ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
这是否可以轻松解决?我的模型中有一个外键,它对应于JSON对象中的一个键值对;与此错误有关吗?
答案 0 :(得分:3)
如果你编写一个独立的 python文件并执行它,这是一个常见的错误。
虽然可以确保正确加载Django框架,但通常的想法是定义custom command [doc]。
因此,在您的文件结构中,如果app
是Concert
所在的应用程序,则可以构建目录和文件(此处以粗体显示):
someapp/ management/ __init__.py commands/ __init__.py load_concerts.py __init__.py models.py views.py
__init__.py
个文件为空。那么您的load_concerts.py
可能会像:
from django.core.management.base import BaseCommand, CommandError
import json
from app.models import Concert
class Command(BaseCommand):
help = 'Load JSON concert data'
def add_arguments(self, parser):
parser.add_argument('concert_file', type=str)
def handle(self, *args, **options):
with open(options['concert_file']) as f:
data = json.load(f)
for concert in data:
Concert.objects.create(**concert)
您可以使用以下命令执行命令:
$ manage.py load_concerts output.json --settings=my_settings
所以就像你运行服务器一样(你可以将它看作内置命令),你可以添加特定的命令。)
通过将文件名定义为参数,我们可以轻松加载我们想要的任何.json
文件。
你可以定义一个松散的Python文件。在这种情况下,您需要加载设置:
from django.conf import settings
from projectroot import settings as projectsettings
settings.configure(projectsettings)
import django
django.setup()
import json
from app.models import Concert
with open('output.json') as f:
data = json.load(f)
for concert in data:
Concert.objects.create(**concert)
然后您可以将PYTHONPATH
设置为项目根目录,从而加载特定设置,但我认为这可能会导致更难以定义您可以轻松重用的命令。