ValueError: invalid literal for int() with base 10: ' ' [Django]
ValueError: invalid literal for int() with base 10: ' ' [Django]
我正在开发一个 Django 应用程序,它从 API 中获取 JSON 数据并将其存储在 PostgreSQL 数据库中。
但是在迁移应用程序时出现此错误:
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']
)
以下任何一项都会出错 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
==== 编辑:在 data = projects[project]
之后放置以下代码
for k, v in data.items():
try:
int(v)
except ValueError:
print k, v
break
Navyad 基本上是正确的,您正在尝试将字符串分配给整数字段(themecode
是一个很好的例子)。
查看 JSON,我看到了类似 "themecode": "79,77,66"
的内容。这只是 不能 插入到整数字段中。您需要将它们更改为 models.CharField
或以某种方式预处理数据(例如,提取第一个数字)。
我正在开发一个 Django 应用程序,它从 API 中获取 JSON 数据并将其存储在 PostgreSQL 数据库中。 但是在迁移应用程序时出现此错误:
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']
)
以下任何一项都会出错 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
==== 编辑:在 data = projects[project]
for k, v in data.items():
try:
int(v)
except ValueError:
print k, v
break
Navyad 基本上是正确的,您正在尝试将字符串分配给整数字段(themecode
是一个很好的例子)。
查看 JSON,我看到了类似 "themecode": "79,77,66"
的内容。这只是 不能 插入到整数字段中。您需要将它们更改为 models.CharField
或以某种方式预处理数据(例如,提取第一个数字)。