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 对象中的键值对之一;这与这个错误有关吗?
这是一个常见的错误,如果你编写一个独立的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 文件。在这种情况下,您需要加载设置:
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为项目根目录,从而加载特定设置,但我认为这可能会导致定义一个可以轻松重用的命令更加痛苦。
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |