【问题标题】:Error Trying to Import JSON to Django Database - TypeError: string indices must be integers尝试将 JSON 导入 Django 数据库时出错 - TypeError:字符串索引必须是整数
【发布时间】:2013-08-28 04:29:00
【问题描述】:

不到一个月,我一直在自学编程。我正在尝试建立一个 Django 站点来帮助这个过程。过去 3 天我一直在寻找解决此问题的方法,但无济于事。

我从 Github 上的某个人那里窃取了这段代码,在调用专门为其编写的 JSON URL 文件时它运行良好。但我一直在尝试修改它以使用另一个 JSON URL 文件,但它不起作用。它是一个命令文件,用于将数据导入数据库。所以当我运行命令时会发生以下情况:

PS C:\django-1.5.1\dota\mysite> python manage.py update_items
Fetching item list..
TypeError: string indices must be integers

如果下面的代码太多,我很抱歉,我真的不知道人们已经隐含地知道了什么样的事情。我正在尝试从此 JSON 文件中列出的每个游戏项目中导入字段。我只是从 2 个字段开始尝试使其正常工作。

您可以从下面的 URL 中查看 JSON 文件,但它的格式如下:

{
"itemdata": {
    "blink": {
        "id": 1,
        "img": "blink_lg.png",
        "dname": "Blink Dagger",
        "qual": "component",
        "cost": 2150,
        "desc": "Active: Blink - Teleport to a target point up to 1200 units away.  If damage is taken from an enemy hero, Blink Dagger cannot be used for 3 seconds.",
        "attrib": "",
        "mc": 75,
        "cd": 12,
        "lore": "The fabled dagger used by the fastest assassin ever to walk the lands.",
        "components": null,
        "created": false
    },
    "blades_of_attack": {
        "id": 2,

这里是与命令文件update_items.py相关的4个文件:

models.py -- 这个模型定义了数据库字段

from django.db import models

class Item(models.Model):
    unique_id = models.IntegerField(unique=True)
    dname = models.CharField(max_length=255)

    def __unicode__(self):
        return self.dname

update_items.py -- 这是将json数据导入数据库的命令文件

from django.core.management.base import BaseCommand, CommandError
from django.core.management.base import NoArgsCommand
from items.utils.api import SteamWrapper
from items.models import Item

class Command(NoArgsCommand):
help = 'Fetches and updates the items'

def update_item(self, item):
    try:
        db_item = Item.objects.get(unique_id=item['id'])
        print 'Updating %s..' % item['dname']
    except Item.DoesNotExist:
        print 'Creating %s..' % item['dname']
    db_item = Item()
    db_item.unique_id = item['id']
    db_item.dname = item['dname']
    db_item.save()
    print 'Done.'

def fetch_items(self, result):
        try:
            for item in result['itemdata']:
            self.update_item(item)
        except KeyError:
            print "Error while contacting steam API. Please retry."

def handle(self, *args, **options):
      self.stdout.write('Fetching item list..')
      result = SteamWrapper.get_item_list()
      self.fetch_items(result)
      self.stdout.write('Finished.')

api.py -- 这是web api调用函数的东西

import requests
from mysite import settings_local

class   SteamWrapper():
    ''' Steam API wrapper '''

API_KEY = settings_local.STEAM_API_KEY

@classmethod
def _item_send_request(cls, endpoint, *args, **kwargs):
    params = {'key': cls.API_KEY}
    params.update(kwargs)
    request = requests.get(endpoint, params=params)
    return request.json()

@classmethod
def get_item_list(cls):
    return cls._item_send_request(settings_local.DOTA2_ITEM_LIST_ENDPOINT)

本地设置.py

DOTA2_ITEM_LIST_ENDPOINT = 'http://www.dota2.com/jsfeed/itemdata'

所以有什么想法吗?非常感谢...

【问题讨论】:

  • 你能在for item in result['itemdata']之前打印result的值吗?
  • 是的,它打印出我认为是 unicode 字符串,如下所示: {u'itemdata': {u'demon_edge': {u'mc': False, u'img': u'demon_edge_lg .png',...等

标签: python database django json


【解决方案1】:

问题出在这里:

for item in result['itemdata']

itemdata 是一个 dict (字典)。在 Python 中,遍历 dict 会产生 keys:所以 item 有“blink”、“blades_of_attack”等等,因此会出现错误。

您似乎根本不需要密钥,因此您应该遍历result['itemdata'].values()

(注意update_item有一个缩进错误:db_item = Item()这一行应该在except内缩进,否则总是会创建一个新项目。)

【讨论】:

  • 哇,非常感谢!因此,如果我还想要键(闪烁、blade_of_attack 等),“result['itemdata']:”已经只遍历键,所以我可以用我的方式将这些键分配给数据库中的一个字段有,对吗?
  • 如果您只需要钥匙,可以。如果两者都需要,可以使用items(),它给出了(键,值)的元组。
【解决方案2】:
def handle(self, *args, **options):
      self.stdout.write('Fetching item list..')
      result = SteamWrapper.get_item_list
      self.fetch_items(result)
      self.stdout.write('Finished.')

result = SteamWrapper.get_item_list 行使result 指向名为get_item_listSteamWrapper 方法。也许您打算通过输入 SteamWrapper.get_item_list() 来调用它?

【讨论】:

  • 哦,是的,你是对的。现在我得到这个错误:TypeError:字符串索引必须是整数!而且我之前确实有过这个错误,这是最初的错误。也许我应该更新原始帖子以反映此错误?感谢您的帮助!
猜你喜欢
  • 2022-07-25
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多