Django - Импорт данных из файла JSON URL в базу данных
Я пытаюсь импортировать данные из json-файла URL в мою базу данных Django на еженедельной основе, чтобы поддерживать мою базу данных в актуальном состоянии. Эти данные поступают из импортера, который был написан на GO и который предоставляет мне этот JSON файл через ссылку.
У меня до сих пор нет способа автоматизировать это или проверить, как проверить, обновился ли элемент или нет, и затем обновить только эти элементы. Но это не является моей главной проблемой сейчас. Моя главная проблема заключается в том, что я получаю следующую ошибку каждый раз, когда пытаюсь импортировать данные с помощью команды manage.py:
File "\data_import\management\commands\import_from_url.py", line 45, in handle
self.import_facility_from_file()
File "\data_import\management\commands\import_from_url.py", line 21, in import_facility_from_file
Name = data_object.get('Name', None)
AttributeError: 'str' object has no attribute 'get'
Это мой код:
import os
import json
from data_import.models import Facility
from django.core.management.base import BaseCommand
from datetime import datetime
from jsontest.settings import BASE_DIR, STATIC_URL
class Command(BaseCommand):
def import_facility_from_file(self):
print(BASE_DIR)
data_folder = os.path.join(BASE_DIR, 'import_data', 'resources')
for data_file in os.listdir(data_folder):
with open(os.path.join(data_folder, data_file), encoding='utf-8') as data_file:
data = json.loads(data_file.read())
for data_object in data:
Name = data_object.get('Name', None)
IssuedNumber = data_object.get('IssuedNumber', None)
release_year = datetime.now()
try:
Facility, created = Facility.objects.get_or_create(
Name=Name,
IssuedNumber=IssuedNumber,
release_year=release_year
)
if created:
Facility.save()
display_format = "\Facility, {}, has been saved."
print(display_format.format(Facility))
except Exception as ex:
print(str(ex))
msg = "\n\nSomething went wrong saving this Facility: {}\n{}".format(Name, str(ex))
print(msg)
def handle(self, *args, **options):
"""
Call the function to import data
"""
self.import_facility_from_file()
JSON выглядит следующим образом:
{"00016ed7be4d872aseddsf6f36bfsdfd647f3eb41cadedd2130bdfsdfsdf6fbbbf24c2f1a64d2cf34ac4e03aaa30309816f98a7389b2bb324a2":{"UUID":"00016ed7be4d872aseddsf6f36bfsdfd647f3eb41cadedd2130bdfsdfsdf6fbbbf24c2f1a64d2cf34ac4e03aaa30309816f98a7389b2bb324a2","Name":"SENIOR CARE","IssuedNumber":"123456","Licensee":"SENIOR CARE","Email":"test@dfjksdajfkljklsd.com","AdministratorName":"Tester","TelephoneNumber":"(123) 456-789101112","AddressInfo":{"PrimaryAddress":"123 Test Road","SecondaryAddress":"","City":"Testcity","RegionOrState":"TESTSTATE","PostalCode":"12345","Geolocation":"11.1111,-11.1111"},"Capacity":1,"MostRecentLicenseTimestamp":1234567891,"ClosedTimestamp":0,"InspectionInfo":{"ComplaintRelatedVisits":0,"InspectionRelatedVisits":0,"NumberOfVisits":0,"LastVisitTimestamp":0},"Complaints":{"ComplaintsTypeA":0,"ComplaintsTypeB":0,"SubstantiatedAllegations":0,"TotalAllegations":0}},
Вы обращаетесь с объектом str как со словарем:
AttributeError: 'str' object has no attribute 'get'
Почему это происходит? Когда вы выполняете итерацию по JSON, внешний объект представляет собой словарь:
data = json.loads(data_file.read())
(Если вы работаете с JavaScript, словарь - это как объект)
Затем выполняется итерация по словарю:
for data_object in data:
Когда вы выполняете итерацию по словарю, вы выполняете итерацию по его ключам. data_object
является строкой, потому что ключи этого словаря являются строками.
Затем вы вызываете .get()
на строке:
Name = data_object.get('Name', None)
Это определено только для словарей, но не для строк.
Вы хотите сделать итерацию по значениям словаря. Как это сделать?
data = json.loads(data_file.read())
for data_object in data.values():
Или, если вам нужны ключи и значения одновременно:
data = json.loads(data_file.read())
for key, data_object in data.items():