0

私は独学でプログラミングを始めて 1 か月も経っていません。プロセスを支援するために 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)

local-settings.py

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

アイデアはありますか?本当にありがとう...

4

2 に答える 2