python - key 错误 : 'locations' in Django app

标签 python django python-3.x postgresql django-models

我正在开发一个 Django 应用程序,它从 API 获取 JSON 数据并将其存储在 PostgreSQL 数据库中。但是在迁移应用程序时出现此错误:

KeyError: 'locations'

这是回溯:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
    utility.execute()
  File "/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 355, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/python/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/python/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/app/aggregator/WorldBank/management/commands/fetch_wb.py", line 23, in handle
    locations = data['locations'],
KeyError: 'locations'

如何解决这个问题?

这是我的 models.py 代码:

from django.db import models
from django.contrib.postgres.fields import JSONField

class Projects(models.Model):
        data = JSONField(null=True)
        project_id=models.CharField(max_length=255)
        project_name=models.CharField(max_length=255)
        status=models.CharField(max_length=255)
        country=models.CharField(max_length=255)
        locations=JSONField()
        mjtheme=models.CharField(max_length=255)
        project_docs=JSONField()
        source=models.CharField(max_length=255)
        mjtheme_namecode=models.CharField(max_length=255)
        docty=models.TextField()
        countryname=models.CharField(max_length=255)
        countrycode=models.CharField(max_length=255)
        themecode=models.CharField(max_length=255)
        theme_namecode=models.CharField(max_length=255)
        project_url=models.TextField()
        totalcommamt=models.CharField(max_length=255)
        mjthemecode=models.CharField(max_length=255)
        sector1=models.CharField(max_length=255)
        theme1=models.CharField(max_length=255)
        theme2=models.CharField(max_length=255)
        theme3=models.CharField(max_length=255)
        projectinfo=models.TextField()
        country_namecode=models.CharField(max_length=255)
        p2a_updated_date=models.CharField(max_length=255)
        p2a_flag=models.CharField(max_length=255)
        project_abstract=JSONField()

这是存储在/management/commands/fetch.py​​ 下的 fetch.py​​ 文件的代码:

import requests
from django.core.management.base import BaseCommand
from aggregator.WorldBank.models import Projects

class Command(BaseCommand):
    def handle(self, **options):
        response = requests.get("https://search.worldbank.org/api/v2/projects?format=json&countryshortname_exact=India&source=IBRD&kw=N&rows=776")
        data = response.json()
        projects = data['projects']

        for project in projects:
            print(projects[project])
            print("\n\n")

            data = projects[project]

            Projects.objects.create(

                project_id = data['id'],
                project_name = data['project_name'],
                status = data['status'],
                country = data['countryshortname'],
                locations = data['locations'],
                mjtheme = data['mjtheme'],
                project_docs = data['projectdocs'],
                source = data['source'],
                mjtheme_namecode = data['mjtheme_namecode'],
                docty = data['docty'],
                countryname = data['countryname'],
                countrycode = data['countrycode'],
                themecode = data['themecode'],
                theme_namecode = data['theme_namecode'],
                project_url = data['url'],
                totalcommamt = data['totalcommamt'],
                mjthemecode = data['mjthemecode'],
                sector1 = data['sector1'],
                theme1 = data['theme1'],
                theme2 = data['theme2'],
                theme3 = data['theme3'],
                projectinfo = data['projectinfo'],
                country_namecode = ['country_namecode'],
                p2a_updated_date = data['p2a_updated_date'],
                p2a_flag = data['p2a_flag'],
                project_abstract = data['project_abstract']

                )

这是我想将 JSON 响应存储到 postgres 数据库中的 API URL: API URL

我如何有效地定义 models.py,以便将此 JSON 响应中的所有字段存储到数据库中?

最佳答案

你的麻烦在于重新声明 data 试一试:

def handle(self, **options):
    response = requests.get("https://search.worldbank.org/api/v2/projects?format=json&countryshortname_exact=India&source=IBRD&kw=N&rows=776")
    data = response.json()

    projects = data.get('projects')

    for pdata in projects.values():
        pdata['project_id'] = pdata.pop('id', None)
        pdata['country'] = pdata.pop('countryshortname', None)
        # other columns need to be ranamed
        Projects.objects.create(**pdata)

关于python - key 错误 : 'locations' in Django app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47364215/

相关文章:

python - 在 pycharm 的标准输出中查看 django.db.backends 日志

python - 如何使用 asyncio 并行计算?

python - 使用函数打破 while 循环

python - django 输出空 csv

python - 使用Django South从具体继承走向抽象继承

python - 如何覆盖 sys.stdin 以复制输入流

python - 连接一个 dask 数据框和一个 pandas 数据框

python - 使用 OpenCV 检测灰色事物

python - PyTorch DataLoader 将批处理作为列表返回,并将批处理作为唯一条目。从我的 DataLoader 获取张量的最佳方法是什么

python - 索引错误: list index out of range on python dynamic variable length