如何在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
相关产品推荐
相关产品推荐

