如何在Django Rest Framework中向一对多表提交含对象数组的POST请求
解决方案
1. 修改序列化器
调整序列化器以支持嵌套的评论数据,并自定义创建逻辑来维护外键关联:
from rest_framework import serializers from .models import Fruit, FruitReviews class FruitReviewSerializer(serializers.ModelSerializer): class Meta: model = FruitReviews fields = ['reviews'] # 无需暴露外键字段,由后端自动关联 class FruitSerializer(serializers.ModelSerializer): # 嵌套评论序列化器,允许写入多条评论 fruitReviews = FruitReviewSerializer(many=True) class Meta: model = Fruit fields = ['name', 'fruitReviews'] def create(self, validated_data): # 从验证后的数据中分离评论部分 reviews_data = validated_data.pop('fruitReviews') # 创建水果主对象 fruit = Fruit.objects.create(**validated_data) # 批量创建评论并关联当前水果 for review_data in reviews_data: FruitReviews.objects.create(fruit=fruit, **review_data) return fruit
2. 简化视图函数
无需单独处理两个序列化器,直接使用修改后的序列化器完成数据写入:
from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from .serializers import FruitSerializer @api_view(['POST']) def createFruit(request): serializer = FruitSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
关键说明
- 原代码问题:直接调用
serializer2.save()时未指定fruit外键,违反数据库约束;且获取评论数据的方式request.data.fruitReviews不符合字典取值规范 - 嵌套序列化器的
create方法是核心:先创建主模型实例,再基于该实例创建关联的子模型数据,确保一对多关系正确 - 返回
201_CREATED更符合REST规范,明确表示资源创建成功
提交你提供的JSON格式数据即可完成水果和评论的批量写入,自动维护关联关系。
内容的提问来源于stack exchange,提问作者Joker Bench
相关产品推荐
相关产品推荐

