Django REPOS Cadre + Django RESTE Swagger + ImageField
j'ai créé un modèle simple avec un champ D'image et je veux faire une vue api avec django-rest-framework + django-rest-swagger, qui est documentée et qui est capable de télécharger le fichier.
Voici ce que j'ai:
models.py
from django.utils import timezone
from django.db import models
class MyModel(models.Model):
source = models.ImageField(upload_to=u'/photos')
is_active = models.BooleanField(default=False)
created_at = models.DateTimeField(default=timezone.now)
def __unicode__(self):
return u"photo {0}".format(self.source.url)
serializer.py
from .models import MyModel
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = [
'id',
'source',
'created_at',
]
views.py
from rest_framework import generics
from .serializer import MyModelSerializer
class MyModelView(generics.CreateAPIView):
serializer_class = MyModelSerializer
parser_classes = (FileUploadParser, )
def post(self, *args, **kwargs):
"""
Create a MyModel
---
parameters:
- name: source
description: file
required: True
type: file
responseMessages:
- code: 201
message: Created
"""
return super(MyModelView, self).post(self, *args, **kwargs)
urls.py
from weddings.api.views import MyModelView
urlpatterns = patterns(
'',
url(r'^/api/mymodel/$', MyModelView.as_view()),
)
Pour moi, ce devrait être assez simple. Cependant, je ne peux pas faire fonctionner le téléchargement. J'ai toujours cette erreur de réponse:
j'ai lu cette partie de la documentation de django-repos-cadre:
If the view used with FileUploadParser is called with a filename URL keyword argument, then that argument will be used as the filename. If it is called without a filename URL keyword argument, then the client must set the filename in the Content-Disposition HTTP header. For example Content-Disposition: attachment; filename=upload.jpg.
cependant l'en-tête est passé par django-rest-swagger dans la propriété Request Payload (de la console chrome).
Si d'info plus est nécessaire, s'il vous plaît laissez-moi savoir.
j'utilise Django==1.8.8
, djangorestframework==3.3.2
et django-rest-swagger==0.3.4
.
3 réponses
j'ai eu ce travail en faisant quelques changements à votre code.
tout d'Abord, dans models.py
, modifiez ImageField
nom file
et utiliser le chemin relatif pour télécharger le dossier. Lorsque vous téléchargez un fichier en flux binaire, il est disponible en request.data
dictionnaire dans un fichier de clé (request.data.get('file')
), donc l'option la plus propre est de l'associer au champ model avec le même nom.
from django.utils import timezone
from django.db import models
class MyModel(models.Model):
file = models.ImageField(upload_to=u'photos')
is_active = models.BooleanField(default=False)
created_at = models.DateTimeField(default=timezone.now)
def __unicode__(self):
return u"photo {0}".format(self.file.url)
serializer.py
, renommer le champ source en fichier:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('id', 'file', 'created_at')