【问题标题】:ValueError: invalid literal for int() with base 10: ' ' [Django]ValueError: int() 以 10 为基数的无效文字:''[Django]
【发布时间】:2023-03-09 02:30:01
【问题描述】:

我正在开发一个 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']

                )

【问题讨论】:

    标签: django python-3.x api django-models valueerror


    【解决方案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
    

    ==== 编辑:在data = projects[project]之后添加以下代码

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

    【讨论】:

    • 是否应该包含 IntegerField(max_length=100)??但也没有解决问题
    • 没有。问题是当你分配像`p2a_updated_date=data['p2a_updated_date']`这样的值时。这里 data['p2a_updated_date'] 应该是整数。
    • 尝试分配 IntegerField('100') 但同样的问题
    • 好的,让我试试 'p2a_updated_date= int(data['p2a_updated_date'])'
    • 那么哪个字段适合这些值呢? @navyad 请帮忙
    【解决方案2】:

    Navyad 基本上是正确的,您正在尝试将字符串分配给整数字段(themecode 是一个很好的例子)。

    查看 JSON,我看到了类似 "themecode": "79,77,66" 的内容。这只是不能插入到整数字段中。您需要将这些更改为 models.CharField 或以某种方式预处理数据(例如,提取第一个数字)。

    【讨论】:

    • 我将所有 IntegerField() 更改为 CharField(max_length=100) 但仍然出现相同的错误:ValueError: invalid literal for int() with base 10: ''
    • 甚至尝试将所有 IntegerField() 更改为 CharField() 但得到相同的错误
    猜你喜欢
    • 2013-08-04
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2017-12-06
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多