django rest框架在序列化程序创建方法中获取请求

Posted

技术标签:

【中文标题】django rest框架在序列化程序创建方法中获取请求【英文标题】:django rest framework get request in serializer create method 【发布时间】:2020-02-29 10:49:00 【问题描述】:

我是学习django rest框架的学生

我尝试使用表单数据上传多个文件

当我在邮递员中发送这样的请求时

enter image description here

发生错误,这是错误消息

images_data = self.context.get('request').request.FILES

AttributeError: 'NoneType' 对象没有属性 'request'

这是模型

class Post(models.Model):
    text = models.CharField(max_length=5000)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

class Image(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    image = models.FileField(blank=True)

和观点

class AddPost(APIView):
    serializer_class = PostSerializer

    def post(self, request, format=None):
        serializer = PostSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return JsonResponse('status':status.HTTP_200_OK, 'message':"sucess", 'data':"")

序列化器

class FileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = '__all__'

class PostSerializer(serializers.ModelSerializer):
    images = FileSerializer(source='image_set', many=True, read_only=True)

    class Meta:
        model = Post
        fields = ('id', 'text', 'owner', 'created_at', 'images')

    def create(self, validated_data):
        images_data = self.context.get('request').request.FILES         
        images_data = self.context.get('request').request.FILES
        post = Post.objects.create(text=validated_data.get('text'),owner=validated_data.get('owner'))
        for image_data in images_data.values():
            Image.objects.create(post=post, image=image_data)
        return post

我已经看到了这个链接 https://codeday.me/en/qa/20190306/12057.html

感谢您的帮助

【问题讨论】:

好吧,我试过了,但还是不行。它发生类似的错误->“NoneType”对象没有属性“文件”。感谢您的评论 【参考方案1】:

只需在views.py中将上下文传递给您的序列化程序

PostSerializer(data=request.data, context='request': request)

然后您将能够在 serializers.py 的上下文中获取请求

self.context.get('request')

【讨论】:

哇,效果很好。我不知道会这么简单。谢谢

以上是关于django rest框架在序列化程序创建方法中获取请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中为枚举字段创建序列化程序

是否可以在 django rest 框架序列化程序中使用重用 django 表单进行验证?

将不在模型中的字段添加到 Django REST 框架中的序列化程序

序列化程序中的django rest框架更新方法,实例不会立即保存

Django rest框架 - 模型序列化程序不会序列化所有字段

Django Rest框架:序列化程序上的共享字段