se optimiza consulta de rutas de mapa

develop/Rodrigo/Backend
Francisco Sandoval 2023-08-27 12:45:48 -04:00
parent 53849df320
commit 10b5741e6d
1 changed files with 15 additions and 13 deletions

View File

@ -2,6 +2,9 @@
from django.http import JsonResponse
from rest_framework.decorators import action, api_view, schema
from django.views.decorators.csrf import csrf_exempt
from django.db.models import F, Subquery, Value
from django.db.models.functions import Coalesce
from ..models import Paradero, ParaderoImagen
from ..models import Linea, GtfsShape, GtfsTrips
from .paradero import url_image_paradero
@ -45,19 +48,18 @@ def paraderos(request):
def rutas(request):
id_linea = request.GET.get('id_linea')
sectores = GtfsTrips.objects.filter(id_linea = id_linea).all()
data = []
for s in sectores:
rutas = GtfsShape.objects.filter(id_shape = s.id_shape).order_by('shape_pt_sequence')
for r in rutas:
data.append({
'shape_pt_lat': r.shape_pt_lat,
'shape_pt_lon': r.shape_pt_lon,
'shape_pt_sequence': r.shape_pt_sequence
})
data_ordenada = sorted(data, key=lambda k: k['shape_pt_sequence'])
# Subquery para obtener los id_shape distintos de gtfs_trips
subquery = GtfsTrips.objects.filter(id_linea = id_linea).values('id_shape').distinct()
# Consulta principal con inner join y ordenamiento
queryset = GtfsShape.objects.annotate(
id_shape_subquery=Subquery(subquery),
shape_pt_sequence_coalesce=Coalesce('shape_pt_sequence', Value(0))
).filter(id_shape=F('id_shape_subquery')).order_by('shape_pt_sequence_coalesce')
result = queryset.values('shape_pt_lat', 'shape_pt_lon', 'shape_pt_sequence')
return JsonResponse({
'google_api_key': google_api_key,
'positions': data_ordenada
'positions': list(result)
})