Задать вопрос

Django REST framework сохранение в поле ImageField?

не получается схоронить изображение в данное поле, подскажите что делаю ни так, или покажите, заранее благодарен.

model.py
class MyPhoto(models.Model):
    owner = models.ForeignKey('auth.User', related_name='image')
    image = models.ImageField(upload_to='photos', max_length=254)


serializers.py
class PhotoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyPhoto
        fields = ('url', 'id', 'image', 'owner')
        owner = serializers.Field(source='owner.username')


view.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

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'),
                       )

urlpatterns = format_suffix_patterns(urlpatterns)


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/


при отправлении данных возвращает:
{"image": ["No file was submitted. Check the encoding type on the form."]}
  • Вопрос задан
  • 10187 просмотров
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
VlastV
@VlastV
Ведущий разработчик – практик
Во первых, информация о файле содержится в request.FILES, соответственно при создании сериализатор, необходимо так же передать ему эту информацию
PhotoSerializer(photo, data=request.DATA, files=request.FILES)

Во вторых, как верно подметил @B7W, необходимо передавать содержимое файла, а не путь до него.

Запрос application/json не поддерживает передачу файла, надо либо использовать raw, либо multipart.
Ответ написан
Комментировать
B7W
@B7W
Вам не кажется что он хочет файл, а не путь до него?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы