0

I have a Viewset that looks like this:

class EstadisticasEquipoViewSet(viewsets.ModelViewSet):
"""
Trae estadísticas totales de todos los equipos de una zona en una respectiva liga.
"""
serializer_class = EstadisticaEquiposSerializer

def get_queryset(self):
    queryset = Estadistica_Equipo_Partido.objects.filter(id_partido__id_zona=self.request.query_params.get('id_zona')).values('id_equipo').annotate(
        ...
        tot_puntos=Sum('puntos'),
        prom_puntos=Avg('puntos'),
        prom_q1=Avg('q1'),
        prom_q2=Avg('q2'),
        prom_q3=Avg('q3'),
        prom_q4=Avg('q4'),
        tot_tiros_campo_convertidos=Sum('tiros_campo_convertidos'),
        prom_tiros_campo_convertidos=Avg('tiros_campo_convertidos'),
        ...
    )

    return queryset

How can I group annotate fields in this groups:

  • promedios -> all fields that starts with prom
  • totales -> all fields that starts with tot

Actually i've this serializer:

class EstadisticaEquiposSerializer(serializers.ModelSerializer):
...
tot_puntos = serializers.IntegerField()
prom_puntos = serializers.FloatField()
tot_tiros_campo_convertidos = serializers.IntegerField()
prom_tiros_campo_convertidos = serializers.FloatField()
tot_tiros_campo_intentados = serializers.IntegerField()
prom_tiros_campo_intentados = serializers.FloatField()
...

class Meta:
    model = Estadistica_Equipo_Partido
    fields = (...
              'tot_puntos', 'prom_puntos', 'tot_tiros_campo_convertidos', 
              ...
              )

I need this json:

{ 
  "promedios": 
           {
            "prom_puntos": 80, 
            "prom_tiros_campo_convertidos": 24, 
            ...
            },
  "totales":
           {
            "tot_puntos": 1171,
            "tot_tiros_convertidos": 684,
            ...
           },
 },

1 Answers1

0

My solution consisted of using SerializerMethodField and another serializer for each category I needed

Serializer.py

class TotalesEstadisticas(serializers.Serializer):
    tot_poss = serializers.IntegerField()
    tot_plays = serializers.IntegerField()
    tot_puntos = serializers.IntegerField()
    tot_tiros_campo_convertidos = serializers.IntegerField()
    ...

class EstadisticaEquiposSerializer(serializers.ModelSerializer):
    ...
    totales = serializers.SerializerMethodField()
    promedios = serializers.SerializerMethodField()
    avanzadas = serializers.SerializerMethodField()

    def get_totales(self, obj):
        return TotalesEstadisticas(obj).data

    def get_promedios(self, obj):
        return PromediosEstadisticas(obj).data

    def get_avanzadas(self, obj):
        return EstadsiticasAvanzadas(obj).data

    class Meta:
        model = Estadistica_Equipo_Partido
        fields = (...,
                  'totales', 'promedios', 'avanzadas')