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

如何在Django REST序列化器中实现目标嵌套JSON格式输出

解决方案

你可以通过两种方式实现需求,可根据你的接口是否需要支持写入操作选择:

方法1:重写to_representation方法(适合只读接口,改造成本最低)

直接在原有序列化器基础上重写输出格式即可,不需要额外定义其他序列化器:

class InnerDivertorSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = InnerDivertor
        fields = ('volume', 'volume_units', 'volume_notes')
    
    def to_representation(self, instance):
        # 先拿到原始的平级字段输出
        raw_data = super().to_representation(instance)
        # 嵌套到volume字段下返回
        return {"volume": raw_data}

class OuterDivertorSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = OuterDivertor
        fields = ('volume', 'volume_units', 'volume_notes')
    
    def to_representation(self, instance):
        raw_data = super().to_representation(instance)
        return {"volume": raw_data}

方法2:定义嵌套序列化器(适合需要支持写入操作的接口)

先封装一个通用的volume字段序列化器,再在原有序列化器中引用,同时重写写入逻辑:

from rest_framework import serializers
from rest_flex_fields import FlexFieldsModelSerializer
from .models import InnerDivertor, OuterDivertor

# 通用volume信息序列化器
class VolumeSerializer(serializers.Serializer):
    volume = serializers.FloatField(allow_null=True)
    volume_units = serializers.CharField(allow_null=True)
    volume_notes = serializers.CharField(allow_null=True, required=False)


class InnerDivertorSerializer(FlexFieldsModelSerializer):
    # source="*"表示将当前模型实例全量传递给子序列化器解析字段
    volume = VolumeSerializer(source="*")
    class Meta:
        model = InnerDivertor
        fields = ('volume',)
    
    # 重写创建逻辑处理嵌套数据
    def create(self, validated_data):
        volume_data = validated_data.pop("*")
        return InnerDivertor.objects.create(**volume_data)
    
    # 重写更新逻辑处理嵌套数据
    def update(self, instance, validated_data):
        volume_data = validated_data.pop("*")
        for attr, value in volume_data.items():
            setattr(instance, attr, value)
        instance.save()
        return instance


class OuterDivertorSerializer(FlexFieldsModelSerializer):
    volume = VolumeSerializer(source="*")
    class Meta:
        model = OuterDivertor
        fields = ('volume',)
    
    def create(self, validated_data):
        volume_data = validated_data.pop("*")
        return OuterDivertor.objects.create(**volume_data)
    
    def update(self, instance, validated_data):
        volume_data = validated_data.pop("*")
        for attr, value in volume_data.items():
            setattr(instance, attr, value)
        instance.save()
        return instance

内容的提问来源于stack exchange,提问作者Anony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:45:01