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

Django DRF报错:'Request' object has no attribute 'get'排查求助

Django DRF:'Request' object has no attribute 'get' 错误排查求助

我在开发基于Django DRF的应用API项目时,遇到一个难以调试的错误:'Request' object has no attribute 'get'。该错误在更新组织后触发,经排查确定来自OrganisationDetail视图的patch方法。

错误有两个特殊点:

  • 本地环境从未出现该错误,仅部署到GCP staging环境时触发;
  • 用户仍能成功创建,但patch请求返回500响应。

目前日志尚未同步到GCP Stackdriver,仅能通过前端API客户端获取错误信息。我已尝试移除视图patch方法中所有的.get()方法,改用try-except处理字典取值,但问题依旧,恳请提供排查思路。

相关视图代码

class OrganisationDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    Retrieve, update or delete an organisation.
    """
    permission_classes = (IsAuthenticated, IsInOrg)
    queryset = Organisation.objects.all()
    serializer_class = OrganisationSerializer
    logger.info("Init log from organisation view")

    def get_object(self, pk):
        try:
            return Organisation.objects.get(pk=pk)
        except Organisation.DoesNotExist:
            return HttpResponse(status=404)

    def get(self, request, pk, format=None):
        organisation = self.get_object(pk)
        serializer = OrganisationSerializer(organisation)
        return Response(serializer.data)

    def patch(self, request, pk, format=None):
        try:
            organisation = self.get_object(pk)
            data = copy.deepcopy(request.data)
            member_to_remove = request.data.get(
                'user_to_remove', 'no_user_to_remove')
            if member_to_remove != 'no_user_to_remove':
                data['member_to_remove'] = member_to_remove
            if "name" not in data:
                data["name"] = organisation.name
            if "description" not in data:
                data["description"] = organisation.description

            serializer = OrganisationSerializer(
                organisation, data=data, context=request, partial=True)

            if serializer.is_valid():
                serializer.save()
                logger.info(f"PATCH SUCCESSFUL: {serializer.data}")
                return Response(serializer.data)
            logger.warning(f"PATCH Failed: {serializer.errors}")
            return JsonResponse(serializer.errors, status=400)
        except Exception as e:
            logger.error(f"PATCH Failed with exception: {e}")
            return JsonResponse({'error': str(e)}, status=500)

序列化器代码

class OrganisationSerializer(serializers.Serializer):
    id = serializers.ReadOnlyField()
    name = serializers.CharField()
    description = serializers.CharField()
    owner = serializers.CharField()
    members = MemberSerializer(many=True, read_only=True)
    new_member = MemberSerializer(required=False)

    class Meta:
        model = Organisation
        fields = [
            'id',
            'owner',
            'name',
            'description',
            'members'
        ]

    def create(self, validated_data):
        """
        Create and return a new `Organisation` instance, given the validated data.
        """
        # an organisation needs the owner to exist
        # so first we create the owner as an
        # inactive user and send them an activation email
        user = create_user_for_organisation(
            validated_data['owner'],
            "ADMIN"
        )
        user.save(update_fields=["is_active"])
        org_data = {
            "owner": user,
            "name": validated_data['name'],
            "description": validated_data['description']
        }
        try:
            org = Organisation.objects.create(**org_data)
            org.members.set([user])
            org.save()
        except Exception as e:
            print('Failed to create Organisation', e)

        send_user_activation_email(user, self.context['request'])
        send_owner_confirmation_email(user, self.context['request'])

        return org

    def update(self, instance, validated_data):
        try:
            instance.name = validated_data.get('name', instance.name)
            owner = User.objects.get(
                email=validated_data.get('owner', instance.owner.email))
            instance.owner = owner
            new_member_details = validated_data.get('new_member')
            if new_member_details != None:
                new_member = create_user_for_organisation(
                    new_member_details['email'], new_member_details['role'])
                instance.members.add(new_member)
                send_user_activation_email(new_member, self.context)
            member_to_remove_id = QueryDict.get(
                self.initial_data, key='user_to_remove')
            if member_to_remove_id != None:
                try:
                    content_lock = ContentLock.objects.get(
                        user_id=member_to_remove_id)
                    content_lock.delete()
                except:
                    pass
                user_to_remove = User.objects.get(id=member_to_remove_id)
                instance.members.remove(user_to_remove)
            instance.save()
            return instance
        except Exception as e:
            logger.error(
                f"Serializer Failed to update organisation with exception: {e}")
            return JsonResponse({'error': str(e)}, status=500)

    def validate(self, data):
        try:
            user = self.context['request'].user
        except Exception:
            user = self.context.user
        except Exception:
            user = self.context
        if not user:
            raise serializers.ValidationError("User not found.")
        if not Organisation.objects.has_create_permission(user):
            if not Organisation.objects.has_update_permissions(user, self.instance.owner.email):
                raise serializers.ValidationError(
                    "User not allowed to create or update organisation.")
        cleandata = data
        if 'members' in self.initial_data:
            if isinstance(self.initial_data['members'], list):
                cleandata['members'] = self.initial_data['members']
            else:
                cleandata['members'] = []
                cleandata['members'].append(self.initial_data["members"])

        return cleandata

内容的提问来源于stack exchange,提问作者Che Coelho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:10:39