当前位置:  开发笔记 > 后端 > 正文

使用Django REST框架ListCreateAPIView上传文件

如何解决《使用DjangoREST框架ListCreateAPIView上传文件》经验,为你挑选了1个好方法。

使用Django REST框架的通用ListCreateAPIView,我创建了一个终点,我认为应该能够通过POST请求上传照片.我正在为本教程建模我的代码.

到目前为止,我已尝试使用Android和curl将文件POST到此端点,并观察到相同的行为:创建了一条新记录,但未附加该文件.由于该文件是必填字段,因此服务器返回500错误.

这个问题看起来很相似,但他没有使用REST框架的通用视图,我不知道为什么......我想在适用的地方利用它们.

这是我的Django视图:

class PhotoList(generics.ListCreateAPIView):
    model = Photo
    serializer_class = PhotoSerializer
    permission_classes = [
        permissions.AllowAny
    ]

......我的模特:

def get_unique_image_file_path(instance=None, filename='dummy.jpg'):
    """
    function to determine where to save images.  assigns a uuid (random string) to each and places it
    in the images subdirectory below media.  by default, we assume the file is a .jpg
    """
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    # TODO: 'images' is hard coded
    return os.path.join('images', filename)

class Photo(models.Model):
    post = models.ForeignKey(Post, related_name='photos', null=True, blank=True)
    image = models.ImageField(upload_to=get_unique_image_file_path)

    def get_image_abs_path(self):
        return os.path.join(settings.MEDIA_ROOT, self.image.name)

...和我的序列化器:

class PhotoSerializer(serializers.ModelSerializer):
    image = serializers.Field('image.url')

class Meta:
    model = Photo

再现错误

为了生成行为,我使用以下curl命令POST到服务器(与我的Android客户端代码完全相同):

curl --form image=@test_image.jpg http://localhost:8000/rest_tutorial/photos

调查一下generics.ListCreateAPIView,该create()方法如下所示:

# Copied from rest_framework.mixins.CreateModelMixin 

def create(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.DATA, files=request.FILES)

    if serializer.is_valid():
        self.pre_save(serializer.object)
        self.object = serializer.save(force_insert=True)
        self.post_save(self.object, created=True)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED,
                        headers=headers)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

当我在PyCharm的调试器中逐步执行上面的代码时,我可以在序列化器的init_files字段中清楚地看到我的文件serializer.get_serializer().但是,序列化程序的object字段有一堆回溯,但没有对我的图像文件的引用.也许这里有问题?

self.object = serializer.save(force_insert=True)使用空图像字段创建记录后,文件不会上载,self.object.image.file只包含引用a的回溯ValueError.

有任何想法吗?谢谢!



1> Fiver..:

我相信问题出在你的序列化器类中,你将image模型字段定义为Field.通用Field是只读的,因此可能是问题的根源.尝试从序列化程序中删除它,因为没有必要:

class PhotoSerializer(serializers.ModelSerializer):

    class Meta:
        model = Photo

希望这有帮助,让我知道你是如何相处的.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有