Django REST Framework image upload
you can create separate endpoint for uploading images, it would be like that:
class ProductViewSet(BaseViewSet, viewsets.ModelViewSet): queryset = Product.objects.all() serializer_class = ProductSerializer @detail_route(methods=['post']) def upload_docs(request): try: file = request.data['file'] except KeyError: raise ParseError('Request has no resource file attached') product = Product.objects.create(image=file, ....)
you can go around that solution
I lately start Django and have same problem for upload image.
All steps that i done
Install Pillow for using ImageField
pip install Pillow
In
Settings.py
add these linesMEDIA_ROOT = os.path.join(BASE_DIR, 'media')MEDIA_URL = '/media/' # 'http://myhost:port/media/'
Use ImageField in model.py (create
nameFile
function for create folder and name of file)def nameFile(instance, filename): return '/'.join(['images', str(instance.name), filename])class UploadImageTest(models.Model): name = models.CharField(max_length=100) image = models.ImageField(upload_to=nameFile, blank=True, null=True)
serializer.py
class ImageSerializer(serializers.ModelSerializer): class Meta: model = UploadImageTest fields = ('name', 'image')
views.py
class ImageViewSet(ListAPIView): queryset = UploadImageTest.objects.all() serializer_class = ImageSerializer def post(self, request, *args, **kwargs): file = request.data['file'] image = UploadImageTest.objects.create(image=file) return HttpResponse(json.dumps({'message': "Uploaded"}), status=200)
urls.py: add this line
path('upload/', views.ImageViewSet.as_view(), name='upload'),
admin.py: add this line (for check in admin)
admin.site.register(UploadImageTest)
in terminal
python manage.py makemigrationspython manage.py migrate
models.py
from django.db import modelsclass imageupload(models.Model):title = models.CharField(max_length=50)images = models.ImageField('images')
serializers.py
from rest_framework import serializersfrom .models import imageuploadclass imageuploadSerializer(serializers.HyperlinkedModelSerializer):class Meta: model = imageupload fields= ( 'title', 'images' )
views.py
from rest_framework import viewsetsfrom .models import imageuploadfrom .serializers import imageuploadSerializerclass Imageuploadviewset(viewsets.ModelViewSet): queryset = imageupload.objects.all() serializer_class = imageuploadSerializer
urls.py
from django.urls import path, includefrom rest_framework.routers import DefaultRouterfrom . import viewsrouter = DefaultRouter()router.register(r'imageupload', views.Imageuploadviewset)urlpatterns = [ path('imageupload', include(router.urls)),]