0

不到一个月,我一直在自学编程。我正在尝试建立一个 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'

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

4

2 回答 2

1

问题在这里:

for item in result['itemdata']

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

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

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

于 2013-08-25T18:30:25.720 回答
0
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指向一个SteamWrapper名为的方法get_item_list。也许您打算通过键入来调用它SteamWrapper.get_item_list()

于 2013-08-25T16:55:10.693 回答