Python Django Rest 框架 ImageField
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20303252/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Django Rest Framework ImageField
提问by M.Hoffa
I can not save the image in this ImageField.
我无法在此 ImageField 中保存图像。
when sending data back:
发回数据时:
{
"image": ["No file was submitted. Check the encoding type on the form."]
}
model.py
模型.py
class MyPhoto(models.Model):
owner = models.ForeignKey('auth.User', related_name='image')
image = models.ImageField(upload_to='photos', max_length=254)
serializers.py
序列化程序.py
class PhotoSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyPhoto
fields = ('url', 'id', 'image', 'owner')
owner = serializers.Field(source='owner.username')
view.py
查看.py
class PhotoList(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
def get(self, request, format=None):
photo = MyPhoto.objects.all()
serializer = PhotoSerializer(photo, many=True)
return Response(data=serializer.data, status=status.HTTP_200_OK)
def post(self, request, format=None):
serializer = PhotoSerializer(data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def pre_save(self, obj):
obj.owner = self.request.user
class PhotoDetail(APIView):
permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)
def get_object(self, pk):
try:
return MyPhoto.objects.get(pk=pk)
except MyPhoto.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
photo = self.get_object(pk)
serializer = PhotoSerializer(photo)
return Response(serializer.data)
def put(self, request, pk, format=None):
photo = self.get_object(pk)
serializer = PhotoSerializer(photo, data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
photo = self.get_object(pk)
photo.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def pre_save(self, obj):
obj.owner = self.request.user
url.py
网址.py
urlpatterns = patterns('',
url(r'^$', 'main.views.main_page'),
url(r'^api/photo/$', views.PhotoList.as_view(), name='myphoto-list'),
url(r'^api/photo/(?P<pk>[0-9]+)/$', views.PhotoDetail.as_view(), name='myphoto-detail'),)
curl
卷曲
curl -X POST -S \
-H 'Content-Type: application/json' \
-u "michael:bush_pass" \
--data-binary '{"owner":"/users/1/", \
"image":"/Users/test/Downloads/1383310998_05.jpg"}' \
127.0.0.1:8000/api/photo/
采纳答案by Kevin Stone
You seem to be missing the request.FILESargument to the serializer constructor in the your postand puthandlers.
您似乎request.FILES在您的post和put处理程序中缺少序列化器构造函数的参数。
serializer = PhotoSerializer(data=request.DATA, files=request.FILES)
回答by Scofield77
I think you can use request.datainstead after django rest framework 3.0. The usage of request.DATAand request.FILESis now pending deprecation in favor of a single request.dataattribute that contains all the parsed data.
我认为您可以request.data在django rest framework 3.0. 的使用request.DATA和request.FILES现在是等待赞成单一的弃用request.data包含解析出的所有数据属性。
You can check it from here
你可以从这里检查
回答by chandan
Following should work if you are posting the image as base64 string and your serializer set accordingly and it inherits serializer.Serializer
如果您将图像发布为 base64 字符串并且相应地设置了序列化程序并且它继承了 serializer.Serializer,则以下应该有效
# views.py
import base64
import os
from django.core.files import File
class PhotoList(APIView):
def post(self,request,format=None):
serializer = PhotoSerializer(data=request.data)
if serializer.is_valid():
# access the data as serializer.validated_data['keys']
# save the MyPhoto obj lets call it myphoto
# get the base64 string
imgstr64 = serializer.validated_data['corresponding filed in the serializer']
imgdata = base64.b64decode(imgstr64)
fname = '/tmp/%s.jpg'%(str(myphoto.id))
with open(fname,'wb') as f:
f.write(imgdata)
imgname = '%s.jpg'%(str(myphoto.id))
myphoto.image.save(imgname,File(open(fname,'r')))
os.remove(fname)
回答by Ajeet Shah
Uploading image files with Django Rest Framework:
使用 Django Rest Framework 上传图像文件:
models.py:
模型.py:
class MyPhoto(models.Model):
name = models.CharField(max_length=255)
image = models.ImageField(upload_to='myphoto/%Y/%m/%d/', null=True, max_length=255)
serializers.py:
序列化程序.py:
class MyPhotoSerializer(serializers.ModelSerializer):
class Meta:
model = MyPhoto
fields = ('id', 'name', 'image')
views.py:
视图.py:
class PhotoList(APIView):
def post(self, request, format=None):
serializer = MyPhotoSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Hope it helps someone.
希望它可以帮助某人。

