REST Django - 无法从我的验证器中找到请求的上下文

REST Django - Can't find context of request from within my validator

请温柔点。我是 Django 新手,我发现抽象级别简直令人难以抗拒。

我的最终目标是修改进入模型的图像文件。该部分可能相关也可能不相关,但我在 post 中得到了帮助,它建议我应该在验证器内部进行更改:

无论如何,目前我只是想获取请求的上下文,这样我就可以确保仅在请求为 POST 时才对事物执行操作。但是,在我的验证器中,self.context 只是一个空字典。根据我在那里发现的内容,self.context['request'] 应该有一个值。 这是我拥有的:

带有验证器方法的序列化器:

class MediaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Media
        fields = '__all__'

    def validate_media(self, data):
        print(self.context)
        #todo: why is self.context empty?
        #if self.context['request'].method == 'POST':
        #    print('do a thing here')
        return data

    def to_representation(self, instance):
        data = super(MediaSerializer, self).to_representation(instance)
        return data

视图以及 post 方法

class MediaView(APIView):
    queryset = Media.objects.all()
    parser_classes = (MultiPartParser, FormParser)
    permission_classes = [permissions.IsAuthenticated, ]
    serializer_class = MediaSerializer

    def post(self, request, *args, **kwargs):

        user = self.request.user
        print(user.username)

        request.data.update({"username": user.username})

        media_serializer = MediaSerializer(data=request.data)
        # media_serializer.update('username', user.username)
        if media_serializer .is_valid():
            media_serializer.save()
            return Response(media_serializer.data, status=status.HTTP_201_CREATED)
        else:
            print('error', media_serializer.errors)
            return Response(media_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

模特:

class Media(models.Model):
    objects = None
    username = models.ForeignKey(User, to_field='username',
                                 related_name="Upload_username",
                                 on_delete=models.DO_NOTHING)
    date = models.DateTimeField(auto_now_add=True)
    #temp_media = models.FileField(upload_to='upload_temp', null=True)
    media = models.FileField(upload_to='albumMedia', null=True)
    #todo: potentially this will go to a temp folder, optimize will be called and then permananent home will be used -jjb
    #MEDIA_ROOT path must be /src/upload
    file_type = models.CharField(max_length=12)
    MEDIA_TYPES = (
        ('I', "Image"),
        ('V', "Video")
    )
    media_type = models.CharField(max_length=1, choices=MEDIA_TYPES, default='I')

    ACCESSIBILITY = (
        ('P', "Public"),
        ('T', "Tribe"),
        ('F', "Flagged")
    )

    user_access = models.CharField(max_length=1, choices=ACCESSIBILITY, default='P')

所以我只是想弄清楚如何解决这个上下文问题。另外,如果有关于如何到达我要去的地方的任何其他提示,我将不胜感激。

PS 我是新来的。如果我以不适合堆栈溢出的方式写了这个问题,请善待,我会更正它。谢谢

我认为您不必担心在 validate_media() 方法中检查请求是否为 POST。通常只在 POST、PATCH 和 PUT 请求期间进行验证。最重要的是,验证仅在您在序列化程序上调用 is_valid() 时发生,通常在视图中显式调用,就像您在 post() 函数中所做的那样。只要你从不从 post() 以外的任何地方调用 is_valid(),你就知道它是 POST。由于您不支持 patch()put(),因此这应该不是问题。

inside my validator, the self.context is just an empty dictionary

您必须在创建序列化程序时显式传入上下文才能使其存在。这里没有魔法。正如您在 the source code 中看到的那样,当您不传入时,context 默认为 {}

要传递上下文,您可以这样做:

        context = {'request': request}
        media_serializer = MediaSerializer(data=request.data, context=context)

更好的是,传入方法即可:

        context = {'method': request.method}
        media_serializer = MediaSerializer(data=request.data, context=context)

您可以根据需要制作 context 词典。