将图像从media_root保存到Django Rest Serializer

时间:2017-03-15 18:09:55

标签: django image serialization django-rest-framework httprequest

我目前正在开发一个允许移动应用用户将图像上传到Django Server的项目。

这是我的视图,它提供来自用户的POST请求:

类ImageDetailsViewSet(APIView):

def post(self,request, *args, **kwargs):
        try:
            ######### Accept string from the user
            imgStr = request.data['image']

            media_filename = os.path.join(settings.MEDIA_ROOT, 'img.jpg')

            ######## Create decoded string to a JPEG file and save it to media_root
            img = Image.open(StringIO(imgStr.decode('base64')))
            img.save(media_filename, 'JPEG')

            ###### Update request data to include the newly created image to the request
            user = request.user.get_username()
            data1 = {'image': media_filename, 'category': 1, 'status': 'Y', 'user': user}

            serializer = ImageDetailsSerializer(data=data1)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
        except:
            raise
            return Response(serializer.errors, status=status.HTTP_415_BAD_REQUEST)

我的ImageDetailsS​​erializer:

class ImageDetailsSerializer(serializers.ModelSerializer):  
    class Meta:
        model = ImageDetails
        fields= ('image','status','category', 'user')

代码始终返回HTTP 400错误,这意味着序列化程序无效。

以下是我尝试应用但在这种情况下无效的解决方案:

  1. 将media_filename从data1 = {'image': media_filename, 'category': 1, 'status': 'Y', 'user': user}更改为img,但会返回TypeError: <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=2976x3968 at 0x841D2F0> is not JSON serializable错误

  2. 将media_filename替换为media_url/img.jpg,它会返回相同的错误。

  3. 通过添加(参见下面的代码)更新序列化程序中的图像字段,但它确实做了任何改进:

       class ImageDetailsSerializer(serializers.ModelSerializer):   
           image = serializers.ImageField(use_url=True)
           class Meta:
                model = ImageDetails
                fields= ('image','status','category', 'user')
    
  4. 我的问题是:

    1. 什么应该存储在序列化程序的ImageField中?图像,图像URL或存储图像的目录?

    2. 这是从远程用户保存数据的正确方法/技巧吗?或者还有其他有效的方法来实现这个吗?

2 个答案:

答案 0 :(得分:0)

  1. 它是相对于media_root的路径
  2. 您可以将data1更改为request.data的副本并合并密钥&#34; user&#34;进入新词典

答案 1 :(得分:0)

这个问题的答案是使用Django-extra-fields插件。 :d 请阅读https://github.com/Hipo/drf-extra-fields了解详情。