Почему так долго выполняется работа с базой данных в django?
С помощью time.time()
проверяю время выполнения обращения к базе.
def checkCleanQueryset(self, **kwargs) -> list:
result_queryset = []
result_queryset = list(kwargs['dict_queryset'])
i = 0
start_time = time.time()
for r in list(kwargs['dict_queryset']):
for key_uuid, value_uuid in r['related_uuid'].items():
try:
currentStore = StoreRelated.objects.get(related_uuid__icontains=key_uuid)
if self.request.user in currentStore.store.user_permission.all():
break
else:
result_queryset.remove(r)
break
except ObjectDoesNotExist:
result_queryset.remove(r)
break
i = i + 1
print("%i --- %s seconds ---" % (i, time.time() - start_time))
return result_queryset
вывод print
>> 259 --- 0.7878916263580322 seconds ---
то есть 259 обращений к базе занимает 0.7 секунд? почему так долго? из-за try
или icontains
?
def checkCleanQueryset(self, **kwargs) -> list:
result_queryset = []
i = 0
start_time = time.time()
user_store = StoreRelated.objects.filter(store__user_permission=self.request.user)
for r in list(kwargs['dict_queryset']):
related_uuids = r['related_uuid'].keys()
if related_uuids and user_store.filter(related_uuid__icontains=related_uuids[0]).exists():
result_queryset.append(r)
i = i + 1
print("%i --- %s seconds ---" % (i, time.time() - start_time))
return result_queryset
Так должно работать сильно быстрее.
Наверняка можно сделать лучше т.к. __icontains
это очень тяжелая операция, к тому же непонятно, что прилетает в кваргах в результате мы без понятия какие конкретно запросы генерятся в бд.
если kwargs['dict_queryset']
содержит именно объект QuerySet, то его преобразование в список само по себе вызывает вытаскивание из бд всего что есть в этом кверисете. Не надо так делать.
Ну и да - в вопросе нет ничего ни про структуру моделей, ни процесса формирования кваргов. Рекомендую добавить индексы к полям, по которым производится поиск данных.