ho risolto questo problema con ModelViewSet e ModelSerializer. Spero che questo aiuti la comunità.
Ho anche il privilegio di avere la convalida e l'accesso Object-> JSON (e viceversa) nello stesso serializzatore anziché nelle viste.
Lo capiamo con l'esempio.
Dire, voglio creare l'API FileUploader. Dove memorizzerà campi come id, percorso_file, nome_file, dimensione, proprietario ecc. Nel database. Vedi modello di esempio:
class FileUploader(models.Model):
file = models.FileField()
name = models.CharField(max_length=100) #name is filename without extension
version = models.IntegerField(default=0)
upload_date = models.DateTimeField(auto_now=True, db_index=True)
owner = models.ForeignKey('auth.User', related_name='uploaded_files')
size = models.IntegerField(default=0)
Ora, per le API questo è quello che voglio:
GET: Quando sparo l'endpoint GET, voglio tutti i campi di cui sopra per ogni file caricato.
POST: Ma per l'utente per creare/caricare file, perché deve preoccuparsi di passare tutti questi campi. Può solo caricare il file e quindi, suppongo, il serializzatore può ottenere il resto dei campi dal FILE caricato.
Searilizer: Domanda: ho creato sotto serializzatore per servire il mio scopo. Ma non sono sicuro se è il modo giusto per implementarlo.
class FileUploaderSerializer(serializers.ModelSerializer):
#overwrite = serializers.BooleanField()
class Meta:
model = FileUploader
fields = ('file','name','version','upload_date', 'size')
read_only_fields = ('name','version','owner','upload_date', 'size')
def validate(self, validated_data):
validated_data['owner'] = self.context['request'].user
validated_data['name'] = os.path.splitext(validated_data['file'].name)[0]
validated_data['size'] = validated_data['file'].size
#other validation logic
return validated_data
def create(self, validated_data):
return FileUploader.objects.create(**validated_data)
Viewset per riferimento:
class FileUploaderViewSet(viewsets.ModelViewSet):
serializer_class = FileUploaderSerializer
parser_classes = (MultiPartParser, FormParser,)
# overriding default query set
queryset = LayerFile.objects.all()
def get_queryset(self, *args, **kwargs):
qs = super(FileUploaderViewSet, self).get_queryset(*args, **kwargs)
qs = qs.filter(owner=self.request.user)
return qs
Ehi, ti so come ho potuto risolvere http://stackoverflow.com/questions/26673572/django-rest-framework-upload-file-to-a-method? – psychok7
@pleasedontbelong perché il metodo PUT è stato utilizzato qui invece di POST? – RTan
@Rego controlla questo http://stackoverflow.com/a/14402607/361427 :) – pleasedontbelong