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

如何让Django REST API接收列表数据

你的DRF属性列表API问题解答

1. API接收的正确格式

放心,这种包含name/value/unit字段的属性列表,标准且通用的格式就是JSON数组(也就是你说的普通列表),每个数组元素是包含三个字段的对象。这种格式几乎所有REST API都能直接正确解析,不需要额外做特殊处理。

举个实际的请求体示例:

[
  {"name": "环境温度", "value": 26.5, "unit": "℃"},
  {"name": "相对湿度", "value": 58, "unit": "%RH"},
  {"name": "大气压力", "value": 101.3, "unit": "kPa"}
]

只要请求头设置Content-Type: application/json,后端就能直接识别这个结构,不管是DRF还是其他框架都能轻松处理。

2. DRF如何接收多个对象/列表

你之前跟着教程做的应该是单对象的CRUD,要改成支持批量接收对象列表,DRF有两种常用的实现方式,都是官方推荐的:

方法一:利用Serializer的many=True参数(最简便)

首先你肯定已经有了单个属性的Serializer,比如:

from rest_framework import serializers
from .models import Property  # 假设你的模型是Property

class PropertySerializer(serializers.ModelSerializer):
    class Meta:
        model = Property
        fields = ('name', 'value', 'unit')

接下来,在你的视图类里,只需要在获取Serializer的时候,判断请求体是不是数组,如果是就开启many=True。比如用ListCreateAPIView的话:

from rest_framework import generics

class PropertyBatchView(generics.ListCreateAPIView):
    queryset = Property.objects.all()
    serializer_class = PropertySerializer

    def get_serializer(self, *args, **kwargs):
        # 检查请求数据是不是列表格式,如果是就启用批量序列化
        if isinstance(kwargs.get('data', {}), list):
            kwargs['many'] = True
        return super().get_serializer(*args, **kwargs)

这样当你发送上面的JSON数组请求时,DRF会自动把每个元素解析成对应的模型实例,批量完成创建。

方法二:手动在视图中处理批量逻辑(更灵活)

如果需要对批量请求做额外的校验或处理,可以手动在视图的create方法里处理:

from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics

class PropertyBatchCreateView(generics.CreateAPIView):
    queryset = Property.objects.all()
    serializer_class = PropertySerializer

    def create(self, request, *args, **kwargs):
        # 先校验请求体是不是数组格式
        if not isinstance(request.data, list):
            return Response(
                {"error": "请求体必须是包含属性对象的数组"},
                status=status.HTTP_400_BAD_REQUEST
            )
        
        # 用many=True初始化Serializer,批量校验和创建
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(
            serializer.data,
            status=status.HTTP_201_CREATED,
            headers=headers
        )

这种方式你可以在批量处理前后加自己的逻辑,比如批量日志、权限校验等等。

最后提醒一下:测试的时候一定要确保请求头里设置了Content-Type: application/json,不然DRF可能会把请求体当成表单数据,解析错误哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:12:41