django中drf怎么把request传递到serializer中

2025-04-27 17:00:35 by wst

django

有这样一个需求:创建任务的时候需要保存创建者,但是创建者是从request的session中获取的。

解决方法:把request想办法传递到serializer中即可。

代码如下:

视图:

class CombatTaskViewSet(GenericViewSet):
    queryset = CombatTask.objects.filter(is_delete=False)
    serializer_class = CombatTaskSerializer
    filter_class = CombatTaskFilter
    filter_backends = [DjangoFilterBackend]

    @list_route(methods=['POST'])
    def add_task(self, request):
        """
        添加作战任务
        """
        try:
            LOGGER.info("添加作战任务参数:{}".format(request.data))
            request.data["create_name"] = request.session.get("username")
            serializer = self.get_serializer(data=request.data, context={"request": request})
            serializer.is_valid(raise_exception=True)
            _ = serializer.save()
            return response.SuccessResponse({"data": "ok", "user": request.session.get("username")})
        except Exception as e:
            LOGGER.error("添加作战任务失败, error:{}".format(e))
            error_message = str(e).encode('utf-8').decode('unicode_escape')
            return response.ErrorResponse(msg="添加作战任务失败:{}".format(error_message))

序列化器:

class CombatTaskSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    task_id = serializers.CharField(read_only=True)
    name = serializers.CharField(max_length=64)
    picture_url = serializers.CharField(max_length=1024)
    status = serializers.CharField(read_only=True)
    create_time = serializers.DateTimeField(read_only=True)
    create_name = serializers.CharField(required=False, read_only=True)


    class Meta:
        model = CombatTask

    def validate_name(self, value):
        """
        校验 name 字段是否重复
        """
        # 如果是更新操作,跳过重复检查
        if self.instance:
            return value

        # 如果是创建操作,检查数据库中是否已存在相同的 name
        if CombatTask.objects.filter(name=value).exists():
            raise serializers.ValidationError(u"任务名称已存在")
        return value

    @atomic
    def create(self, validated_data):
        try:
            task_id = uuid.uuid4()
            validated_data["status"] = "created"
            validated_data["task_id"] = task_id
            create_name = self.context["request"].session.get("username")
            validated_data["create_name"] = create_name
            instance = CombatTask.objects.create(**validated_data)
            return instance
        except Exception as e:
            return None

注意试图中的:serializer = self.get_serializer(data=request.data, context={"request": request})

以及序列化器中的:create_name = self.context["request"].session.get("username")

看完这两行大概就能明白是怎么回事了。

 

祝你好运,一个热爱编程热爱分享的小鲤鱼。

 


Comments(0) Add Your Comment

Not Comment!