不到一个月,我一直在自学编程。我正在尝试建立一个 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'
那么有什么想法吗?非常感谢...