Python 尝试将JSON导入Django数据库时出错-TypeError:字符串索引必须是整数
我自学编程还不到一个月。我正试图建立一个Django网站来帮助这个过程。我花了三天的时间寻找解决这个问题的方法,但都没有用 我从Github上的某个人那里偷了这段代码,当调用专门为其编写的JSON URL文件时,它工作正常。但我一直试图修改它,使其与另一个JSON URL文件一起使用,但它不起作用。它是一个用于将数据导入数据库的命令文件。下面是我运行命令时发生的情况: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
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()
,它提供(键,值)的元组。