如何在Django REST Framework中将统计关系序列化为指定键值对格式
可以实现你想要的格式,问题出在当前写法让每个统计项返回单独的单键字典,DRF序列化查询集时会把这些字典依次放进数组,才出现数组套单键对象的结构。解决思路是不在子序列化器里处理键名,而是在父序列化器中把所有统计项合并成一个字典:
第一步:修改子序列化器
让StatisticSerializer只返回统计数据本身,不要把name作为外层键:
class StatisticSerializer(serializers.ModelSerializer): class Meta: model = Statistic fields = ['id', 'home_value', 'away_value', 'value']
第二步:在父序列化器中自定义statistics字段
假设你的父模型(包含statistics关联的模型)是Match这类,在它的序列化器里用SerializerMethodField生成目标结构:
class MatchSerializer(serializers.ModelSerializer): # 自定义statistics字段,替换成你的实际父模型 statistics = serializers.SerializerMethodField() class Meta: model = Match fields = ['statistics', ...] # 加上其他需要序列化的字段 def get_statistics(self, instance): # 从父实例获取所有关联的统计项,这里假设关联字段是statistics stats_queryset = instance.statistics.all() # 遍历统计项,用name作为键,序列化后的数据作为值 return {stat.name: StatisticSerializer(stat).data for stat in stats_queryset}
这样序列化后,statistics字段就会变成符合要求的结构(注意你原示例里数组直接放键值对不符合JSON语法,正确结构是用大括号包裹的对象):
"statistics": { "Attacks": { "id": 971, "home_value": 3, "away_value": 2, "value": 5 }, "Corners": { "id": 972, "home_value": 0, "away_value": 0, "value": 0 } }
内容的提问来源于stack exchange,提问作者Sander Bakker
相关产品推荐
相关产品推荐

