DRF序列化器能否将多个字段合并为嵌套JSON?
DRF实现嵌套JSON序列化方案
当然可行,DRF有多种方式能实现你要的这种字段合并成嵌套JSON的需求,下面是两种常用的实现方式:
方案一:用SerializerMethodField自定义嵌套字段
这种方式灵活直接,适合快速实现输出需求:
from rest_framework import serializers from .models import Product class ProductSerializer(serializers.ModelSerializer): # 定义嵌套字段 characteristics = serializers.SerializerMethodField() class Meta: model = Product # 指定要输出的字段,包含自定义的嵌套字段 fields = ['product_type', 'vendor_code', 'name', 'characteristics'] # 实现字段的取值逻辑,把需要合并的字段打包成字典 def get_characteristics(self, obj): return { 'material': obj.material, 'coating': obj.coating, 'gem_type': obj.gem_type, 'gem': obj.gem }
方案二:用嵌套序列化器实现结构化处理
如果需要后续扩展反序列化逻辑(比如接收前端的嵌套格式数据),这种结构化的方式更易维护:
from rest_framework import serializers from .models import Product # 定义嵌套部分的序列化器 class CharacteristicsSerializer(serializers.Serializer): material = serializers.CharField() coating = serializers.CharField() gem_type = serializers.CharField() gem = serializers.CharField(allow_blank=True, allow_null=True) class ProductSerializer(serializers.ModelSerializer): # 用source='*'把当前产品对象传递给嵌套序列化器 characteristics = CharacteristicsSerializer(source='*') class Meta: model = Product fields = ['product_type', 'vendor_code', 'name', 'characteristics']
补充:支持反序列化的处理
如果你的接口需要支持创建/更新产品(也就是接收嵌套格式的请求数据),需要重写序列化器的create或update方法,把嵌套字段拆解后赋值给模型:
def create(self, validated_data): # 取出嵌套的characteristics数据 characteristics = validated_data.pop('characteristics') # 创建产品时合并所有数据 product = Product.objects.create(**validated_data, **characteristics) return product def update(self, instance, validated_data): characteristics = validated_data.pop('characteristics') # 更新基础字段 for attr, value in validated_data.items(): setattr(instance, attr, value) # 更新嵌套对应的字段 for attr, value in characteristics.items(): setattr(instance, attr, value) instance.save() return instance
内容的提问来源于stack exchange,提问作者Bonfire
相关产品推荐
相关产品推荐

