Django REST Framework图像上传

问题描述 投票:11回答:2

我有型号产品:

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

然后我有序列化器:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = (
            ...
            'image',
            ...
        )

然后我有意见:

class ProductViewSet(BaseViewSet, viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

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

django image-upload django-rest-framework
2个回答
9
投票

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

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

你可以解决这个问题

- 更新:这是如何从邮递员enter image description here上传


1
投票

我最近启动Django并且上传图片有同样的问题。

我完成的所有步骤

1)安装Pillow以使用ImageField

pip install Pillow

2)在Settings.py添加这些行

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

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, max_length=254, blank=True, null=True)

4) serialize人.朋友

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = UploadImageTest
        fields = ('name', 'image')

5) views.朋友

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)

6)urls.py:添加此行

path('upload/', views.ImageViewSet.as_view(), name='upload'),

7)admin.py:添加此行

admin.site.register(UploadImageTest)

8)在终端

python manage.py makemigrations

python manage.py migrate
© www.soinside.com 2019 - 2024. All rights reserved.