Неэффективный итерационный процесс над набором запросов Django

Я пытаюсь ускорить время отклика на запрос get из React в Django. Задержка связана с итерацией над отфильтрованным набором запросов.

stop_time_next_hour = StopTime.objects.filter(
        stop_id=stop_id,
        # Get all arrival times in the next hour
        arrival_time__gte=current_time.time(),
        arrival_time__lte=(current_time + timedelta(hours=1)).time(),
    )

Это набор запросов, который необходимо итерировать, и с каждой итерацией посылается запрос к БД, что приводит к медленному времени отклика.

for stop_time in stop_time_next_hour:
    if stop_time.trip.service_id  == str(service_id):
            check_trip_for_update(gtfsDict,stop_time.trip.trip_id)

Фильтр является динамическим и зависит от пользовательского ввода, поэтому набор запросов не может быть загружен до запроса get, содержащего пользовательский ввод.

Как можно оптимизировать эту производительность?

Просто добавьте service_id в фильтр

stop_time_next_hour = StopTime.objects.filter(
    trip__service_id=service_id,
    stop_id=stop_id,
    # Get all arrival times in the next hour
    arrival_time__gte=current_time.time(),
    arrival_time__lte=(current_time + timedelta(hours=1)).time(),
)

И вы можете оптимизировать его еще больше с помощью select_related или prefetch related. Например:

stop_time_next_hour = StopTime.objects.filter(
    trip__service_id=service_id,
    stop_id=stop_id,
    # Get all arrival times in the next hour
    arrival_time__gte=current_time.time(),
    arrival_time__lte=(current_time + timedelta(hours=1)).time(),
).select_related("trip") <-- depends on your db structure

Если существует только один экземпляр с этим service_id, то можно добавить .first() в конце.

Вам необходимо поделиться более подробной информацией для дальнейшей оптимизации

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