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

如何在Django REST Framework权限类中获取请求参数PK

解决方案

错误原因说明

你之前的两种写法都存在逻辑问题:

  • self.kwargs["pk"]中的self是当前自定义权限类的实例,路由解析得到的kwargs参数是绑定在视图实例上的,权限类实例本身不存在该属性,因此会报错
  • request.POST['pk']仅能获取表单格式POST请求携带的参数,URL路径参数、JSON格式请求体参数、GET查询参数都不会存储在request.POST中,同时直接用[]取值时如果参数不存在会直接抛出异常

对应场景的正确写法

根据你要取的PK来源不同,选择对应的写法即可:

场景1:PK是URL路径参数(比如路由配置为path('/demo/<int:pk>/', DemoView.as_view()))

直接从方法传入的view参数中取kwargs即可:

class PermissionName(BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in SAFE_METHODS:
            return True
        # 从视图实例中获取路径参数pk
        pk = view.kwargs.get('pk')
        # 后续自己的权限判断逻辑
        return False

场景2:PK是当前操作的对象本身的主键

has_object_permission方法已经传入了当前操作的对象obj,直接取对象的主键即可,这种方式比取请求参数更安全,能避免请求参数被恶意篡改的问题:

pk = obj.pk
# 或者用你模型里定义的主键字段名,比如obj.id

场景3:PK是URL查询参数(比如请求地址为/demo/?pk=123)

从DRF封装的请求查询参数中取:

pk = request.query_params.get('pk')

场景4:PK放在POST/PUT等请求的请求体中

用DRF封装的request.data获取,支持JSON、表单等多种格式的请求体:

pk = request.data.get('pk')

内容的提问来源于stack exchange,提问作者Jonathan Aplacador

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:06:02