web-dev-qa-db-ja.com

Django RESTフレームワーク画像のアップロード

モデル製品があります:

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で画像をアップロードするにはどうすればよいですか?モデルに画像をアップロードするためのベストプラクティスは何ですか?ありがとうございました。

14
Danila Kulakov

画像をアップロードするために別のエンドポイントを作成できます。それは次のようになります。

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

10
Shehab ElDin

最近Djangoを開始しましたが、画像のアップロードでも同じ問題があります。

私がしたすべてのステップ

1)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)serializer.py

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

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

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
2
Radesh