ich dieses Problem mit ModelViewSet und ModelSerializer gelöst. Hoffe, das wird der Gemeinschaft helfen.
Ich bevorzuge auch Validierung und Objekt-> JSON (und umgekehrt) Login in Serializer selbst und nicht in Ansichten.
Lasst uns das mit einem Beispiel verstehen.
Sagen wir, ich möchte FileUploader API erstellen. Dort werden Felder wie ID, Dateipfad, Dateiname, Größe, Besitzer usw. in der Datenbank gespeichert. Siehe Beispielmodell unter:
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)
Nun Für APIs das ist, was ich will:
GET: Wenn ich die GET-Endpunkt Feuer, ich will alle oben genannten Bereichen für jede hochgeladene Datei.
POST: Aber für Benutzer zum Erstellen/Hochladen von Datei, warum sie sich darum kümmern muss, alle diese Felder zu übergeben. Sie kann einfach die Datei hochladen, und dann kann der Serializer die restlichen Felder von der hochgeladenen Datei abrufen.
Searilizer: Frage: ich unter Serializer erstellt meinen Zweck zu dienen. Aber nicht sicher, ob es der richtige Weg ist, es zu implementieren.
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 Referenz:
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
hey, weißt du, wie ich http://stackoverflow.com/questions/26673572/django-rest-framework-upload-file-to-a-method lösen könnte? – psychok7
@pleasedontbelong Warum wurde hier die PUT-Methode anstelle von POST verwendet? – RTan
@Rego überprüfen Sie diese http://StackOverflow.com/A/14402607/361427 :) – pleasedontbelong