Django REST Framework图像上传

Dan*_*kov 16 django image-upload django-rest-framework

我有型号产品:

def productFile(instance, filename):
    return '/'.join( ['products', str(instance.id), filename] )

class Product(models.Model):
    ...

    image = models.ImageField(
        upload_to=productFile,
        max_length=254, blank=True, null=True
    )
    ...
Run Code Online (Sandbox Code Playgroud)

然后我有序列化器:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = (
            ...
            'image',
            ...
        )
Run Code Online (Sandbox Code Playgroud)

然后我有意见:

class ProductViewSet(BaseViewSet, viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
Run Code Online (Sandbox Code Playgroud)

如何使用Postman上传图片?将图像上传到模型的最佳做法是什么?谢谢.

Rad*_*esh 15

我最近开始使用 Django,上传图片也有同样的问题。

我完成的所有步骤

  1. 安装 Pillow 以使用 ImageField

    pip install Pillow
    
    Run Code Online (Sandbox Code Playgroud)
  2. Settings.py添加这些行

    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/' # 'http://myhost:port/media/'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在model.py中使用ImageField(创建nameFile文件夹和文件名的创建函数)

    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)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 序列化程序.py

    class ImageSerializer(serializers.ModelSerializer):
        class Meta:
            model = UploadImageTest
            fields = ('name', 'image')
    
    Run Code Online (Sandbox Code Playgroud)
  5. 视图.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)
    
    Run Code Online (Sandbox Code Playgroud)
  6. urls.py: 添加这一行

    path('upload/', views.ImageViewSet.as_view(), name='upload'),
    
    Run Code Online (Sandbox Code Playgroud)
  7. admin.py:添加这一行(用于签入管理员)

    admin.site.register(UploadImageTest)
    
    Run Code Online (Sandbox Code Playgroud)
  8. 在终端

    python manage.py makemigrations
    python manage.py migrate
    
    Run Code Online (Sandbox Code Playgroud)


She*_*Din 11

您可以创建单独的端点来上传图像,它将是这样的:

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, ....)
Run Code Online (Sandbox Code Playgroud)

你可以解决这个问题

- 更新:这是如何从邮递员上传 在此输入图像描述

  • 您可以使用 postman 上传,方法是在 body 上选择 `form-data` 并选择类型到文件并点击选择文件,在关键字段上写上 `file` 参见上面的更新。 (2认同)