web-dev-qa-db-fra.com

Django REST Téléchargement d'image du framework

J'ai un modèle de produit:

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

Ensuite, j'ai sérialiseur:

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

Et puis j'ai des vues:

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

Comment puis-je télécharger une image avec Postman? Quelles sont les meilleures pratiques pour télécharger l'image sur le modèle? Merci.

14
Danila Kulakov

vous pouvez créer un point de terminaison distinct pour le téléchargement d'images, ce serait comme ça:

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

vous pouvez contourner cette solution

- mise à jour: voici comment télécharger depuis postman enter image description here

10
Shehab ElDin

J'ai récemment commencé Django et j'ai le même problème pour télécharger l'image.

Toutes les étapes que j'ai faites

1) Installez l'oreiller pour utiliser ImageField

pip install Pillow

2) Dans Settings.py ajoutez ces lignes

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

3) Utilisez ImageField dans model.py (fonction create nameFile pour créer le dossier et le nom du fichier)

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: ajoutez cette ligne

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

7) admin.py: ajoutez cette ligne

admin.site.register(UploadImageTest)

8) dans le terminal

python manage.py makemigrations

python manage.py migrate
2
Radesh