You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:40:39