Почему так долго выполняется работа с базой данных в 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, то его преобразование в список само по себе вызывает вытаскивание из бд всего что есть в этом кверисете. Не надо так делать.

Ну и да - в вопросе нет ничего ни про структуру моделей, ни процесса формирования кваргов. Рекомендую добавить индексы к полям, по которым производится поиск данных.

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