【问题标题】:Struggling to turn JSON data into Django model object instances努力将 JSON 数据转换为 Django 模型对象实例
【发布时间】:2018-11-21 01:11:26
【问题描述】:

我正在尝试获取 JSON 对象列表,将它们转换为 Python 字典,然后使用每个 Python 字典的对象填充 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 对象中的一个键值对;这与这个错误有关吗?

【问题讨论】:

  • 你如何执行这个?只是某个地方的一些文件?通常,您为此使用自定义命令,以便首先加载 Django。问题可能是通过运行文件,您没有加载设置。

标签: json django django-models


【解决方案1】:

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

定义一个自定义命令

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

所以在你的文件结构中,如果app是你的Concert所在的应用程序,你可以构造目录和文件(这里以粗体列出):

一些应用程序/
    管理/
        __init__.py
        命令/
            __init__.py
            load_concerts.py
    __init__.py
    模型.py
    view.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 设置为项目根目录,从而加载特定设置,但我认为这可能会导致定义一个可以轻松重用的命令更痛苦。

【讨论】:

  • 这是一个非常棒且透彻的解释,我非常感谢您花时间起草它。我收到 ImportError:没有名为 management.commands.load_concerts 的模块。我的大部分谷歌搜索让我相信这是我的 init.py 文件丢失或命名错误的问题,但我已经检查并仔细检查了这个问题。会不会是别的?
  • 当然!在您提交回复后,我收到了一个错误,我编辑了我的回复。任何想法可能是什么问题?
  • @Danny: 啊,你可能也应该在管理层添加一个__init__.py 文件,抱歉,会编辑。
  • 啊,完美。完全不需要抱歉。我很感激你的时间。现在我得到一个 IOError:没有这样的文件或目录:'output.json'。该文件与 load_concerts.py 文件位于同一目录中。我猜我需要在设置中四处寻找才能从这里加载?或者我可以把这些文件放在别处?
  • 啊,那么路径应该类似于someapp/management/commands/output.json(应用名称为someapp)。路径相对于您调用脚本的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2022-10-22
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多