【问题标题】:nIs possible group nested objects from the same queryset?是否可能来自同一查询集的组嵌套对象?
【发布时间】:2020-12-23 07:17:44
【问题描述】:

我有一个看起来像这样的视图集:

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,
            ...
           },
 },

【问题讨论】:

  • 你想要的结果中的数字来自哪里?

标签: python django django-rest-framework django-serializer django-rest-viewsets


【解决方案1】:

我的解决方案包括对我需要的每个类别使用 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多