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

Django Rest Framework双嵌套序列化器create方法适配改造问题

双嵌套序列化器create方法实现方案

你只需要参照已有的products嵌套字段处理逻辑,先将prep字段的数据从校验后的validated_data中取出,创建完主Task实例后再生成对应的关联Prep对象即可,分两种常见场景给出实现代码:

场景1:Prep与Task为一对一关联(前端传入的prep是单个对象而非数组)

class TaskSerializer(serializers.ModelSerializer):
    products = ProductSerializer(many=True)
    prep = PrepSerializer()

    class Meta:
        model = Task
        fields = '__all__'

    def create(self, validated_data):           
        # 先提取所有嵌套字段数据
        products_data = validated_data.pop('products')
        prep_data = validated_data.pop('prep')
        # 创建主Task对象
        task = Task.objects.create(**validated_data)
        # 处理products一对多关联
        for product_item in products_data:
            Product.objects.create(task=task, **product_item)
        # 处理prep一对一关联
        Prep.objects.create(task=task, **prep_data)
        return task

场景2:Prep与Task为一对多关联(前端传入的prep是数组,和products逻辑一致)

class TaskSerializer(serializers.ModelSerializer):
    products = ProductSerializer(many=True)
    prep = PrepSerializer(many=True)

    class Meta:
        model = Task
        fields = '__all__'

    def create(self, validated_data):           
        # 先提取所有嵌套字段数据
        products_data = validated_data.pop('products')
        prep_data = validated_data.pop('prep')
        # 创建主Task对象
        task = Task.objects.create(**validated_data)
        # 处理products一对多关联
        for product_item in products_data:
            Product.objects.create(task=task, **product_item)
        # 处理prep一对多关联
        for prep_item in prep_data:
            Prep.objects.create(task=task, **prep_item)
        return task

注意事项

  • 如果你的嵌套字段支持批量写入,必须在序列化器字段声明时加上many=True参数,否则DRF在校验请求数据阶段就会报错
  • 如果Prep模型中关联Task的外键字段名不是task,请将创建Prep对象时的参数替换为实际的外键字段名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:54:03