如何在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
相关产品推荐
相关产品推荐

