如何在Django的create方法中正确获取requesterid对象?
解决Django REST Framework中无法访问requesterid的权限验证问题
问题说明
在RequestListCreateView的create方法中尝试通过request.requesterid获取请求发起者ID时,触发错误:'Request' object has no attribute 'requesterid'。需求是仅当该发起者对应的userroleid为3时,允许执行创建请求的操作。
错误原因
DRF的request对象本身并不包含requesterid属性——这个字段是requestTable模型中的外键,要么是前端通过请求体传入的参数,要么你想获取的是当前登录的认证用户(若启用了身份验证)。直接通过request.requesterid访问必然报错。
解决方案
根据业务场景,分两种情况处理:
情况1:requesterid由前端在请求体中传入
从request.data中提取requesterid,查询对应的用户实例后验证角色:
from rest_framework.exceptions import ValidationError from rest_framework.response import Response class RequestListCreateView(ListCreateAPIView): queryset = requestTable.objects.all() serializer_class = RequestCreateSerializer def create(self, request, *args, **kwargs): # 从请求数据中获取requesterid requester_id = request.data.get('requesterid') if not requester_id: raise ValidationError("requesterid为必填字段") # 查询对应的用户实例 try: requester = userTable.objects.get(userid=requester_id) except userTable.DoesNotExist: raise ValidationError("无效的requesterid") # 验证用户角色ID是否为3 if requester.userroleid.roleid == 3: write_serializer = RequestCreateSerializer(data=request.data) write_serializer.is_valid(raise_exception=True) instance = self.perform_create(write_serializer) headers = self.get_success_headers(write_serializer.data) # 注意requestTable的主键是rid,不是requestid return Response( {"Request ID": write_serializer.instance.rid, "Parts ID": [p.partsid for p in write_serializer.instance.parts.all()]}, headers=headers ) raise ValidationError("抱歉!你的角色无权限创建请求")
情况2:requester为当前登录的认证用户
若启用了DRF身份验证(如Token认证),直接使用request.user获取当前用户,无需前端传入requesterid:
from rest_framework.exceptions import ValidationError from rest_framework.response import Response from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated class RequestListCreateView(ListCreateAPIView): queryset = requestTable.objects.all() serializer_class = RequestCreateSerializer # 启用Token认证和登录权限验证 authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated] def create(self, request, *args, **kwargs): # 验证当前登录用户的角色ID if request.user.userroleid.roleid == 3: write_serializer = RequestCreateSerializer(data=request.data) write_serializer.is_valid(raise_exception=True) # 自动将当前用户设置为请求发起者 write_serializer.validated_data['requesterid'] = request.user instance = self.perform_create(write_serializer) headers = self.get_success_headers(write_serializer.data) return Response( {"Request ID": write_serializer.instance.rid, "Parts ID": [p.partsid for p in write_serializer.instance.parts.all()]}, headers=headers ) raise ValidationError("抱歉!你的角色无权限创建请求")
关键注意点
userroleid是userTable中关联roleTable的外键,因此需要通过requester.userroleid.roleid获取角色ID,不能直接用userroleid == 3(userroleid是对象而非整数)。requestTable的主键字段是rid,代码中返回的Request ID要对应这个字段,原代码中的requestid是笔误。
内容的提问来源于stack exchange,提问作者anastasia
相关产品推荐
相关产品推荐

