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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:20:36