是否可以将同一查询集中的嵌套对象分组?

2024-06-02 07:39:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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开头的所有字段
  • 总计->;以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,
            ...
           },
 },

Tags: idclassavgquerysetserializersintegerfieldpromtot
1条回答
网友
1楼 · 发布于 2024-06-02 07:39:30

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

序列化程序.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')

相关问题 更多 >