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():
Вернуться на верх