如何基于DRF实现接收组件ID列表并返回对应数据的API?
解决方案
1. 编写序列化器
组件数据序列化器
用于将Component模型实例转换为前端需要的JSON格式:
from rest_framework import serializers from .models import Component class ComponentSerializer(serializers.ModelSerializer): class Meta: model = Component fields = ['id', 'name', 'price']
请求体验证序列化器
负责校验前端传入的ID数组格式合法性:
class ComponentIdsSerializer(serializers.Serializer): compIds = serializers.ListField( child=serializers.IntegerField(min_value=1) )
2. 编写视图集
自定义ViewSet处理批量查询的POST请求:
from rest_framework import viewsets, status from rest_framework.response import Response from .models import Component from .serializers import ComponentSerializer, ComponentIdsSerializer class ComponentBatchViewSet(viewsets.GenericViewSet): serializer_class = ComponentIdsSerializer queryset = Component.objects.all() def create(self, request, *args, **kwargs): # 验证请求数据格式 serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) # 获取合法的ID列表 comp_ids = serializer.validated_data['compIds'] # 批量查询对应组件 components = Component.objects.filter(id__in=comp_ids) # 序列化查询结果并返回 response_serializer = ComponentSerializer(components, many=True) return Response(response_serializer.data, status=status.HTTP_200_OK)
3. 配置路由
在项目的urls.py中添加路由配置:
from django.urls import path, include from rest_framework.routers import DefaultRouter from .views import ComponentBatchViewSet router = DefaultRouter() router.register(r'components/batch', ComponentBatchViewSet, basename='component-batch') urlpatterns = [ path('', include(router.urls)), ]
关键说明
- 用
id__in进行批量查询,比循环单查性能更优 - 请求体序列化器确保传入的
compIds是正整数组成的列表,拦截无效请求 - 响应直接返回符合预期格式的组件数据列表
内容的提问来源于stack exchange,提问作者Seyedmahdi moosavyan
相关产品推荐
相关产品推荐

