如何在Django REST框架的get_queryset方法中正确传递URL参数?
解决Django中URL参数传递给ListAPIView筛选结果的问题
你碰到的get_queryset() missing 1 required positional argument: 'bar_pk'错误,核心原因是Django REST Framework的ListAPIView里,get_queryset方法的默认签名不接受额外位置参数。URL中捕获的bar_pk参数,会自动存到视图实例的self.kwargs字典里,不是直接作为参数传入方法。
正确的代码修改
调整FooListView的get_queryset实现即可:
from django.shortcuts import get_object_or_404 from rest_framework.generics import ListAPIView class FooListView(ListAPIView): serializer_class = FooSerializer permission_classes = (permissions.IsAuthenticated,) pagination_class = StandardResultsSetPagination def get_queryset(self): # 从视图的kwargs字典中取出URL传递的bar_pk bar_pk = self.kwargs['bar_pk'] # 用get_object_or_404替代直接get,Bar不存在时返回404而非500错误 bar = get_object_or_404(Bar, pk=bar_pk) # 筛选关联的Foo实例并按id倒序排列 return Foo.objects.filter(bar=bar).order_by('-id')
关键说明
- 删掉
get_queryset方法的bar_pk参数,该方法的标准签名就是def get_queryset(self): - 通过
self.kwargs['bar_pk']获取URL参数是DRF视图的标准做法,所有URL中捕获的命名参数都会存在这个字典里 - 使用
get_object_or_404能让接口在目标Bar不存在时返回更合理的404响应,避免直接抛出服务器错误
内容的提问来源于stack exchange,提问作者Nikko
相关产品推荐
相关产品推荐

