2017-11-17 1 views
0

API에서 JSON 데이터를 가져 와서 PostgreSQL 데이터베이스에 저장하는 Django 애플리케이션에서 작업하고 있습니다. 하지만이 오류 받고 있어요 응용 프로그램을 마이그레이션하는 동안 :ValueError : 밑이 10 인 int()에 대한 리터럴이 잘못되었습니다. [Django]

내가 코드를 변경해야합니까
ValueError: invalid literal for int() with base 10: '' 

이 오류를 해결할 수 있습니까?

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 "/python/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
    File "/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
    File "/python/lib/python3.6/site-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/python/lib/python3.6/site-packages/django/db/migrations/migration.py", line 129, in apply 
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
    File "/python/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 87, in database_forwards 
    field, 
    File "/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 415, in add_field 
    definition, params = self.column_sql(model, field, include_default=True) 
    File "/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 155, in column_sql 
    default_value = self.effective_default(field) 
    File "/python/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 229, in effective_default 
    default = field.get_db_prep_save(default, self.connection) 
    File "/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 770, in get_db_prep_save 
    prepared=False) 
    File "/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 762, in get_db_prep_value 
    value = self.get_prep_value(value) 
    File "/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1853, in get_prep_value 
    return int(value) 
ValueError: invalid literal for int() with base 10: '' 

어떻게이 문제를 해결하기 위해 : 다음 역 추적입니까?

여기 models.py에 대한 내 코드입니다 :

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

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

을 그리고 여기 /management/commands/fetch.py에 저장됩니다 fetch.py ​​파일에 대한 코드입니다 :

import requests 
from django.core.management.base import BaseCommand 
from worldBank.worldBankApp.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=7") 
     data = response.json() 
     projects = data['projects'] 

     #print(data) 

     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'] 

       ) 

답변

1

오류가 다음 중 하나에 해당됩니다. IntegerField.

themecode=models.IntegerField() 
theme_namecode=models.IntegerField() 
totalcommamt=models.IntegerField() 
mjthemecode=models.IntegerField() 
p2a_updated_date=models.IntegerField() 

이유 : 당신은 정수 값을 (. 예 : 4 또는 '4') 대신하지 할당 할 예정. 위 필드의 값을 확인하십시오.

===== 편집

정수 필드 (들)에 대한 응답으로 오는 값 :

themecode: "79,77,66", # invalid 
mjthemecode: "10,10,5", # invalid 
p2a_updated_date: "2017-09-01 00:00:00.0", # invalid 
theme_namecode: [] # invalid 

==== 편집 : 장소 다음 코드

for k, v in data.items(): 
    try: 
     int(v) 
    except ValueError: 
     print k, v 
     break 
+0

IntegerField (max_length = 100)를 포함해야합니까? 문제는 해결되지 않습니다. – 4M01

+0

문제는 'p2a_updated_date = data ['p2a_updated_date ']'와 같은 값을 할당 할 때 발생합니다. 여기서 data [ 'p2a_updated_date']는 정수 여야합니다. – navyad

+0

IntegerField ('100')을 지정했지만 동일한 문제가 발생했습니다. – 4M01

0

data = projects[project] 후 Navyad는 대체로 정확합니다. 정수 필드에 문자열을 할당하려고합니다 (themecode이 좋은 예입니다).

JSON을 살펴보면, "themecode": "79,77,66"과 같은 것을 볼 수 있습니다. 단순히 은 정수 필드에을 삽입 할 수 없습니다. 예를 들어 models.CharField으로 변경하거나 데이터를 사전 처리해야합니다 (예 : 첫 번째 숫자 추출).

+0

모든 IntegerField()가 CharField (max_length = 100)로 변경되었지만 여전히 동일한 오류가 발생했습니다. ValueError : int()의 밑이 10 인 경우 문자가 올바르지 않습니다. ' – 4M01

+0

은 IntegerField()를 CharField() 오류 – 4M01

관련 문제