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

如何重写Django REST Framework ModelViewSet的create动作实现批量创建?

重写Django REST Framework ModelViewSet的create动作实现批量创建

1. 序列化器准备

默认的ModelSerializer原生支持批量处理,无需额外修改,直接使用即可:

from rest_framework import serializers
from .models import Item

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ['id', 'name']

2. 重写ViewSet的create方法

修改ItemViewSet,重写create方法以支持批量数据创建:

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from django.db import transaction
from .models import Item
from .serializers import ItemSerializer

class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

    def create(self, request, *args, **kwargs):
        is_bulk = isinstance(request.data, list)
        serializer = self.get_serializer(data=request.data, many=is_bulk)
        serializer.is_valid(raise_exception=True)
        
        # 原子事务确保批量操作一致性
        with transaction.atomic():
            self.perform_create(serializer)
        
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

3. 发起批量创建请求

向视图对应的API端点(如/api/items/)发送POST请求,请求体采用JSON数组格式:

[ {"name": "Book"}, {"name": "PC"}, {"name": "Phone"} ]

需确保请求头设置Content-Type: application/json。

核心注意事项

  • 原子性:通过transaction.atomic()保证批量创建的原子性,避免部分数据写入成功、部分失败的不一致状态。
  • 兼容性:该实现同时支持单个对象和批量对象的创建请求,无需拆分接口。
  • 验证机制:序列化器的验证规则会自动作用于每条数据,任意一条验证失败都会终止整个请求并返回错误信息。
  • 性能与限制:根据业务需求配置节流类和权限类,防止单次请求创建过量记录导致性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:45:46