Неэффективный итерационный процесс над набором запросов 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()
в конце.
Вам необходимо поделиться более подробной информацией для дальнейшей оптимизации