Как разобрать xml и записать иерархию в базу данных django? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь проанализировать XML-файл и сохранить иерархию в базе данных, но кажется, что я сделал это неправильно, особенно при создании объектов в базе данных, потому что для сохранения этих данных требуется много времени и запросов. Я понятия не имею, как сделать лучше, надеюсь, вы мне поможете

пример XML-файла:

<RECORD><OBL_NAME>Автономна Республіка Крим</OBL_NAME><REGION_NAME></REGION_NAME><CITY_NAME>м.Сімферополь</CITY_NAME><CITY_REGION_NAME></CITY_REGION_NAME></RECORD>
<RECORD><OBL_NAME>Автономна Республіка Крим</OBL_NAME><REGION_NAME></REGION_NAME><CITY_NAME>м.Сімферополь</CITY_NAME><CITY_REGION_NAME></CITY_REGION_NAME></RECORD>
<RECORD><OBL_NAME>Автономна Республіка Крим</OBL_NAME><REGION_NAME></REGION_NAME><CITY_NAME>м.Севастополь</CITY_NAME><CITY_REGION_NAME>с.Балка</CITY_REGION_NAME></RECORD>
<RECORD><OBL_NAME>Автономна Республіка Крим</OBL_NAME><REGION_NAME></REGION_NAME><CITY_NAME>м.Севастополь</CITY_NAME><CITY_REGION_NAME>с.Набережне</CITY_REGION_NAME></RECORD>

def data_xml_parser(xml_file):
    tree = ET.parse(xml_file)
    # get document root
    root = tree.getroot()
    # find all records of data
    structure = []
    s = set()
    for records in root.iter('RECORD'):

        obl_name = records.find('OBL_NAME').text
        region_name = records.find('REGION_NAME').text
        city_name = records.find('CITY_NAME').text
        city_region_name = records.find('CITY_REGION_NAME').text

        d = {'OBL_NAME': obl_name, 'R_NAME': region_name, 'CITY_NAME': city_name,
             'CITY_REGION_NAME': city_region_name}
        # prevent duplicate data
        t = tuple(d.items())
        if t not in s:
            s.add(t)
            structure.append(d)
    return structure

и мой файл, в который я пытаюсь записать данные в базу данных, например, Obl_name-> Region_name-> City_name-> City_region_name:


class Command(BaseCommand):

    help = 'Fill DB with initial data'

    def handle(self, *args, **options):
        for entry in get_dataset():
            oblast = Place.objects.get_or_create(name=entry.get('OBL_NAME'))
            region = None
            city = None
            if entry.get('REGION_NAME') is not None:
                region = Place.objects.get_or_create(name=entry.get('REGION_NAME'),
                                                     parent=oblast)
            if entry.get('CITY_NAME') is not None and region is not None:
                city = Place.objects.get_or_create(name=entry.get('CITY_NAME'),
                                                   parent=region)
            elif entry.get('CITY_NAME') is not None:
                city = Place.objects.get_or_create(name=entry.get('CITY_NAME'),
                                                   parent=oblast)
            # if entry.get('CITY_REGION_NAME') is not None and city is not None:
            #     Place.objects.get_or_create(name=entry.get('CITY_REGION_NAME'),
            #                                 parent=city)
        self.stdout.write(self.style.SUCCESS('Database updated successfully!'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...