我目前正在开发一个允许移动应用用户将图像上传到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)
我的ImageDetailsSerializer:
class ImageDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = ImageDetails
fields= ('image','status','category', 'user')
代码始终返回HTTP 400错误,这意味着序列化程序无效。
以下是我尝试应用但在这种情况下无效的解决方案:
将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
错误
将media_filename替换为media_url/img.jpg
,它会返回相同的错误。
通过添加(参见下面的代码)更新序列化程序中的图像字段,但它确实做了任何改进:
class ImageDetailsSerializer(serializers.ModelSerializer):
image = serializers.ImageField(use_url=True)
class Meta:
model = ImageDetails
fields= ('image','status','category', 'user')
我的问题是:
什么应该存储在序列化程序的ImageField中?图像,图像URL或存储图像的目录?
这是从远程用户保存数据的正确方法/技巧吗?或者还有其他有效的方法来实现这个吗?
答案 0 :(得分:0)
data1
更改为request.data
的副本并合并密钥&#34; user&#34;进入新词典答案 1 :(得分:0)
这个问题的答案是使用Django-extra-fields插件。 :d 请阅读https://github.com/Hipo/drf-extra-fields了解详情。