Python 尝试将JSON导入Django数据库时出错-TypeError:字符串索引必须是整数

Python 尝试将JSON导入Django数据库时出错-TypeError:字符串索引必须是整数,python,database,django,json,Python,Database,Django,Json,我自学编程还不到一个月。我正试图建立一个Django网站来帮助这个过程。我花了三天的时间寻找解决这个问题的方法,但都没有用 我从Github上的某个人那里偷了这段代码,当调用专门为其编写的JSON URL文件时,它工作正常。但我一直试图修改它,使其与另一个JSON URL文件一起使用,但它不起作用。它是一个用于将数据导入数据库的命令文件。下面是我运行命令时发生的情况: PS C:\django-1.5.1\dota\mysite> python manage.py update_items

我自学编程还不到一个月。我正试图建立一个Django网站来帮助这个过程。我花了三天的时间寻找解决这个问题的方法,但都没有用

我从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文件中列出的每个游戏项目导入字段。我只是从两个字段开始尝试让它工作

您可以从下面的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.')
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)
local-settings.py

DOTA2_ITEM_LIST_ENDPOINT = 'http://www.dota2.com/jsfeed/itemdata'
有什么想法吗?非常感谢

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_list
SteamWrapper
方法。也许您想通过键入
SteamWrapper.get\u item\u list()

来调用它。问题在于:

for item in result['itemdata']
itemdata是一个dict(of dict)。在Python中,通过dict进行迭代会产生关键点:因此
item
存在“闪烁”、“刀片式攻击”等错误

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


(注意,
update\u item
中有一个缩进错误:行
db\u item=item()
应该缩进
中,除了
,否则将始终创建一个新项。)

哦,是的,你说得对。现在我得到了这个错误:TypeError:字符串索引必须是整数!事实上,我之前犯过这个错误,这是最初的错误。也许我应该更新原始帖子来反映这个错误?谢谢你的帮助!你能在
之前为结果中的项['itemdata']
打印
结果的值吗?是的,它打印出我认为是unicode字符串的内容,如:{u'itemdata':{u'demon_edge':{u'mc edge':{u'img':False,u'img':u'demon_edge_lg.png',等等。哇,非常感谢你!如果我还想要这些键(眨眼,刀锋攻击,等等),“result”['itemdata']:“已经只遍历了键,所以我可以按照我的方式将这些键分配给数据库中的一个字段,对吗?如果您只需要这些键,可以。如果您需要这两个键,可以使用
items()
,它提供(键,值)的元组。