Betrachten Sie diesen Fall, wo ich ein Book
und Author
Modell habe.Ändern Sie ein Feld in einem Django REST Framework ModelSerializer basierend auf dem Anforderungstyp?
serializers.py
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = models.Author
fields = ('id', 'name')
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
class Meta:
model = models.Book
fields = ('id', 'title', 'author')
viewsets.py
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
Dies funktioniert gut, wenn ich eine GET
Anfrage für ein Buch schicken. Ich bekomme eine Ausgabe mit einem verschachtelten Serializer, der die Buchdetails und die verschachtelten Autorendetails enthält, was ich will.
Allerdings, wenn ich möchte ein Buch erstellen/aktualisieren, ich habe ein gerade ihre ID statt POST
/PUT
/PATCH
mit den verschachtelten Details des Autors zu senden. Ich möchte in der Lage sein, ein Buchobjekt zu erstellen/aktualisieren, indem ich eine Autoren-ID und nicht das gesamte Autorenobjekt spezifiziere.
Also, etwas, wo mein Serializer für eine GET
Anfrage wie folgt aussieht
class BookSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
class Meta:
model = models.Book
fields = ('id', 'title', 'author')
und meine Serializer sieht aus wie dies für eine POST
, PUT
, PATCH
Anfrage
class BookSerializer(serializers.ModelSerializer):
author = PrimaryKeyRelatedField(queryset=Author.objects.all())
class Meta:
model = models.Book
fields = ('id', 'title', 'author')
ich auch nicht wollen um zwei völlig separate Serialisierer für jede Art von Anfrage zu erstellen. Ich möchte nur das author
Feld in der BookSerializer
ändern.
Schließlich gibt es eine bessere Möglichkeit, diese ganze Sache zu tun?
Schauen Sie auf http://www.django-rest-framework.org/api-guide/routers/ - fügen Sie Dekorateure hinzu, die Ihren Bedürfnissen entsprechen. – dmitryro
@ dmitryro Ich verstehe es nicht. Könnten Sie bitte weiter erklären? Wie würde das Hinzufügen von Dekoratoren Felder für Serializer ändern? –
Sie müssen einen benutzerdefinierten Router erstellen, der verschiedene Anforderungsmethoden verarbeitet - POST, GET, PUT und Ihre Methoden auf der Grundlage der gewünschten Anforderungsmethode dekorieren - Dokumentation enthält einige Beispiele. Siehe auch http://stackoverflow.com/questions/28957912/overriding-django-rest-viewset-with-custom-post-method-and-model – dmitryro