努力将 JSON 数据转化为 Django 模型对象实例

Dan*_*nny 1 django json django-models

我正在尝试获取 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)
Run Code Online (Sandbox Code Playgroud)

我收到一条我以前从未见过的错误消息:

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.
Run Code Online (Sandbox Code Playgroud)

这是可以轻松解决的问题吗?我的模型中有一个外键对应于 JSON 对象中的键值对之一;这与这个错误有关吗?

Wil*_*sem 5

这是一个常见的错误,如果你编写一个独立的python文件并执行它。

定义自定义命令

尽管您可以确保正确加载 Django 框架,但通常的想法是您定义自定义命令[doc]

因此,在您的文件结构中,如果app是您所在的应用程序,Concert则可以构建目录和文件(此处以粗体列出):

someapp/
     management/ 
        __init__.py 
        commands/ 
            __init__.py 
            load_concerts.py
    __init__.py
    模型.py
    视图.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)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令执行命令:

$ manage.py load_concerts output.json --settings=my_settings
Run Code Online (Sandbox Code Playgroud)

因此,就像您运行服务器一样(您可以将其视为内置命令),因此您可以添加特定命令)。

通过将文件名定义为参数,我们可以轻松加载.json我们想要的任何文件。

一个独立的Python 程序

可以定义一个松散的 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)
Run Code Online (Sandbox Code Playgroud)

然后您可以将 设置PYTHONPATH为项目根目录,从而加载特定设置,但我认为这可能会导致定义一个可以轻松重用的命令更加痛苦。