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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:40:37