私は独学でプログラミングを始めて 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'
アイデアはありますか?本当にありがとう...