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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:40:11