问题描述
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')