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()
Любая подсказка для решения моего дела будет приветствоваться