Django asyncio для сохранения (большого количества) объектов - Ничего не сохраняется

Я хочу получить категории из Magento API и отобразить их в шаблоне. В то же время, я хочу сохранить их в БД для последующего использования. Категорий слишком много и рендеринг шаблона занимает более 30 секунд. Я начал учиться использовать asyncio, но не смог разобраться с этим. Наверняка я что-то упустил.

<
@login_required
def get_categories(request):
    Category.objects.all().delete()
    try:
        cats = fetch_categories()
        tree = cats['children_data']
    except:
        print('erreur : impossible de récupérer les catégories (fetch_categories)')

    asyncio.run(parse_categories(tree))
    return render(request, 'categories/categories_list.html', {'tree': tree})

Когда я получаю "дерево категорий", я отправляю его на

async def parse_categories(tree):

    for lvl1 in tree:
        all_tasks = []
        asyncio.create_task(save_cat(lvl1))

        # main products categories (turbo, injectors ...)
        for lvl2 in lvl1['children_data']:
            asyncio.create_task(save_cat(lvl2))

            # sub categories like RENAULT, DACIA
            for lvl3 in lvl2['children_data']:
                asyncio.create_task(save_cat(lvl3))

                for lvl4 in lvl3['children_data']:
                    asyncio.create_task(save_cat(lvl4))

                    for lvl5 in lvl4['children_data']:
                        asyncio.create_task(save_cat(lvl5))

Моя функция save() является асинхронной. Я не уверен, что так и должно быть. До того, как я начал использовать async, она работала.

async def save_cat(cat):
    cat_id = cat['id']

    new_cat = Category()
    new_cat.id = cat_id
    new_cat.name = cat.get('name', None)
    new_cat.parent = cat.get('parent_id', None)
    new_cat.url = cat.get('path', None)
    new_cat.is_active = cat.get('is_active', None)
    new_cat.position = cat.get('position', None)
    new_cat.level = cat.get('level', None)
    new_cat.save()

Когда я запускаю, ошибки нет. Контекст хорошо отправляется в шаблон и хорошо отображается. Но ни одна категория не сохраняется. Я также пытался составить список задач с помощью asyncio.create_task на каждом уровне и выполнить цикл в конце parse_categories(), как сказано в этой теме, без успеха.

all_tasks.append(asyncio.create_task(save_cat(lvl1)))
[...]
responses = asyncio.gather(*all_tasks, return_exceptions=True)
loop = asyncio.get_event_loop()
loop.run_until_complete(responses)
loop.close()

Любая подсказка для решения моего дела будет приветствоваться

Вернуться на верх