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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:25:32