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

时间:2018-06-11 17:59:48

标签: json django 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)

我收到了以前没见过的错误信息:

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对象中的一个键值对;与此错误有关吗?

1 个答案:

答案 0 :(得分:3)

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

定义自定义命令

虽然可以确保正确加载Django框架,但通常的想法是定义custom command [doc]

因此,在您的文件结构中,如果appConcert所在的应用程序,则可以构建目录和文件(此处以粗体显示):

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程序

可以定义一个松散的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设置为项目根目录,从而加载特定设置,但我认为这可能会导致更难以定义您可以轻松重用的命令。