2017-11-18 176 views
2

我正在研究一個Django應用程序,它從API中獲取JSON數據並將其存儲在PostgreSQL數據庫中。但是,在遷移應用程序我得到這個錯誤:KeyError:Django應用中的'locations'

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中的所有字段都響應到數據庫中?

+0

顯然,沒有'locations'關鍵。 –

回答

1

你的麻煩是重新申報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) 
+0

感謝您的答案..但我應該在哪裏編寫此代碼?在models.py或fetch.py​​中? – 4M01

+0

編輯希望它有幫助 –

+0

非常感謝你! – 4M01