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

