DRF中如何将workshop_id改为URL路径参数并实现客户列表过滤?
将DRF的查询参数改为路径参数实现车间客户列表过滤
一、修改URL路径配置
把原URL路径调整为带路径参数的形式,指定参数类型为整数(确保传入有效ID):
path('<int:workshop_id>/customer-list/', views.CustomerList.as_view(), name='customer_list'),
调整后访问的URL格式为 http://localhost:8000/1/customer-list/,其中1为目标车间ID。
二、修改视图类代码
DRF类视图中,路径参数会被自动解析到self.kwargs字典中,需调整workshop_id的获取方式及过滤逻辑:
from rest_framework import status from rest_framework.response import Response from rest_framework.generics import ListAPIView from .models import Customer from .serializers import CustomerSerializer class CustomerList(ListAPIView): queryset = Customer.objects.all() serializer_class = CustomerSerializer filter_backends = [SearchFilter] search_fields = ['customer_name'] def filter_queryset(self, queryset): # 从kwargs中获取路径参数workshop_id workshop_id = self.kwargs.get('workshop_id') queryset = queryset.filter(workshop_id=workshop_id) return super().filter_queryset(queryset) def list(self, request, *args, **kwargs): # 路径参数是URL必填部分,缺失会直接匹配不到视图,无需额外校验 return super(CustomerList, self).list(request, *args, **kwargs)
补充说明
- 路径参数
<int:workshop_id>由Django路由自动校验类型,若传入非整数内容会直接返回404错误,省去手动校验参数有效性的步骤。 - 路径参数属于URL的必填组成部分,不存在缺失场景,因此原
list方法中的参数缺失校验逻辑可以直接移除。
内容的提问来源于stack exchange,提问作者Salman Khan
相关产品推荐
相关产品推荐

