n 是否可能对来自同一查询集的嵌套对象进行分组?

问题描述

我有一个如下所示的视图集:

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

如何将这些组中的注释字段分组:

  • promedios -> 所有以 prom 开头的字段
  • totales -> 所有以 tot 开头的字段

实际上我有这个序列化程序:

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',...
              )

我需要这个json:

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

解决方法

我的解决方案包括为我需要的每个类别使用 SerializerMethodField 和另一个序列化器

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')

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...