【问题标题】:Uploading a file with Django REST framework ListCreateAPIView使用 Django REST 框架 ListCreateAPIView 上传文件
【发布时间】:2014-04-18 20:45:41
【问题描述】:

使用 Django REST 框架的通用 ListCreateAPIView,我创建了一个我认为应该能够通过 POST 请求上传照片的端点。我在 this tutorial 上建模我的代码。

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

This question 看起来很相似,但他没有使用 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.ListCreateAPIViewcreate() 方法如下所示:

# 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 只包含一个引用ValueError 的回溯。

有什么想法吗?谢谢!

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我相信问题出在您将image 模型字段定义为Field 的序列化程序类中。通用 Field 是只读的,因此这可能是问题的根源。尝试简单地从序列化程序中删除它,因为它不是必需的:

    class PhotoSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Photo
    

    希望这会有所帮助,让我知道你们相处得如何。

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2015-10-04
      • 2013-12-26
      • 2016-10-25
      • 1970-01-01
      • 2016-02-16
      • 2021-09-27
      • 1970-01-01
      • 2018-01-09
      相关资源
      最近更新 更多