diff --git a/project/api/views/mapa.py b/project/api/views/mapa.py index 999bb5f..c28255a 100755 --- a/project/api/views/mapa.py +++ b/project/api/views/mapa.py @@ -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) }) \ No newline at end of file