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

