Почему я получаю TypeError строковые индексы должны быть целыми числами в этом вызове API? (посев Django DB)
Я пытаюсь посеять django DB из внешнего API, используя это руководство (https://medium.com/@chilinski.a/how-to-seed-a-django-api-with-data-from-an-external-api-b577b6e6ad54).
Я точно воспроизвел код для своего собственного проекта, я думаю, но получаю TypeError при запуске python manage.py seed
и не уверен, почему. Вот сообщение об ошибке:
File "...nrel/nrel_app/management/commands/seed.py", line 15, in seed_nrel utility_name = i["utility_name"], TypeError: индексы строк должны быть целыми числами
Вот мой код:
import requests
from django.core.management.base import BaseCommand
from nrel_app.models import Nrel
def get_nrel():
url = 'https://developer.nrel.gov/api/utility_rates/v3.json?api_key=DEMO_KEY&lat=35.45&lon=-82.98'
r = requests.get(url, headers={'Content=Type': 'nrel_app/json'})
Nrels = r.json()
return Nrels
def seed_nrel():
for i in get_nrel():
Nrels = Nrel(
utility_name = i['utility_name'],
company_id = i['company_id'],
utility_info =i['utility_info'],
residential = i['residential'],
commercial = i['commercial'],
industrial = i['industrial'],
)
Nrels.save()
class Command(BaseCommand):
def handle(self, *args, **options):
seed_nrel()
print("Completed.")
Вот json, запрашиваемый с nrel api:
{"inputs":{"lat":"35.45","lon":"-82.98"},"errors":[],"warnings":[],"version":"3.1. 0", "metadata":{"sources":["Ventyx Research (2012)"]}, "outputs":{"company_id": "8333|18642", "utility_name": "Haywood Electric Member Corp|Tennessee Valley Authority", "utility_info": [{"company_id": "8333", "utility_name": "Haywood Electric Member Corp"}, {"company_id": "18642", "utility_name": "Tennessee Valley Authority"}], "commercial":0. 0977,"industrial":0.0862,"residential":0.123}}
Думаю, вам следует убрать цикл for и получить результат из объекта, возвращаемого методом get_nrel()
напрямую:
def seed_nrel():
i = get_nrel()['options']
Nrels = Nrel(
utility_name = i['utility_name'],
company_id = i['company_id'],
utility_info =i['utility_info'],
residential = i['residential'],
commercial = i['commercial'],
industrial = i['industrial'],
)
Nrels.save()