Пока функцию оптимизировал так
active_modal = get_object_or_404(Modal, slug="connect-modal")
all_modals = list()
all_modals.append(active_modal.id)
def get_referenced(modal):
for item in modal.items.all():
if not item.is_product and item.to_id is not None:
all_modals.append(item.to_id)
get_referenced(item.to)
get_referenced(active_modal)
modals = Modal.objects.filter(pk__in=all_modals)
print(all_modals)
Результат -> 768 запросов (вдвое меньше). Подумываю над оптимизацией шаблона
UPD 2) Кеширование объектов. Сделал выборку данных одним запросом, потом, питоном все monkey_patching-ом заполнил
for modal in modals:
modal.items_cached = [item for item in items if item.of_id == modal.id]
Т.е вместо modal.items.all стало modals.items_cached
62 запросов
UPD 3) вместо все фигни сделал так
active_modal = get_object_or_404(Modal, slug="connect-modal")
modals_ids = list()
modals_ids.append(active_modal.id)
all_modals = list(Modal.objects.all())
all_modals.append(active_modal)
items = ModalItem.objects.all()
for modal in all_modals:
modal.items_cached = [item for item in items if item.of_id == modal.id]
def get_referenced(modal):
for item in modal.items_cached:
if not item.is_product and item.to_id is not None:
modals_ids.append(item.to_id)
for modal in all_modals:
if modal.id == item.to_id:
get_referenced(modal)
break
get_referenced(active_modal)
modals = [modal for modal in all_modals if modal.id in modals_ids]
3 запроса