Ich hatte die gleichen Fragen wie Sie zuvor, aber als ich mich mit dem Quellcode von rest_framework befasste, erhielt ich die folgenden Ergebnisse, hoffe, es hilft:
Zu Frage 1. Warum müssen wir partiell = True angeben?
Diese Frage bezieht sich auf HTTP-Verben .
PUT : Die PUT-Methode ersetzt alle aktuellen Darstellungen der Zielressource durch die Anforderungsnutzlast.
PATCH : Mit der PATCH-Methode werden teilweise Änderungen an einer Ressource vorgenommen.
Im Allgemeinen partialwird verwendet, um zu überprüfen, ob die Felder im Modell für die Feldvalidierung benötigt werden, wenn der Client Daten an die Ansicht sendet.
Zum Beispiel haben wir ein BookModell wie diese, pls Anmerkung beide die nameund author_nameFelder sind obligatorisch (nicht null & nicht leer).
class Book(models.Model):
name = models.CharField('name of the book', max_length=100)
author_name = models.CharField('the name of the author', max_length=50)
Book.objects.create(name='Python in a nut shell', author_name='Alex Martelli')
Bei einigen Szenarien können wir zu aktualisieren Teil der Felder in dem Modell nur benötigen, zB wir Update nur müssen nameFeld in der Book. In diesem Fall sendet der Client nur das nameFeld mit dem neuen Wert an die Ansicht. Die vom Kunden übermittelten Daten können folgendermaßen aussehen:
{"pk": 1, name: "PYTHON IN A NUT SHELL"}
Möglicherweise haben Sie jedoch bemerkt, dass unsere Modelldefinition nicht author_nameleer sein darf. Also müssen wir partial_updatestatt verwenden update. Das restliche Framework führt daher keine Feldvalidierungsprüfung für die Felder durch, die in den Anforderungsdaten fehlen.
Zu Testzwecken können Sie zwei Ansichten für beide updateund erstellen partial_update, und Sie werden besser verstehen, was ich gerade gesagt habe.
Beispiel:
views.py
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import UpdateModelMixin
from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
class BookUpdateView(GenericAPIView, UpdateModelMixin):
'''
Book update API, need to submit both `name` and `author_name` fields
At the same time, or django will prevent to do update for field missing
'''
queryset = Book.objects.all()
serializer_class = BookSerializer
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
class BookPartialUpdateView(GenericAPIView, UpdateModelMixin):
'''
You just need to provide the field which is to be modified.
'''
queryset = Book.objects.all()
serializer_class = BookSerializer
def put(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
urls.py
urlpatterns = patterns('',
url(r'^book/update/(?P<pk>\d+)/$', BookUpdateView.as_view(), name='book_update'),
url(r'^book/update-partial/(?P<pk>\d+)/$', BookPartialUpdateView.as_view(), name='book_partial_update'),
)
Zu übermittelnde Daten
{"pk": 1, name: "PYTHON IN A NUT SHELL"}
Wenn Sie den obigen JSON an das /book/update/1/senden, wird der folgende Fehler mit HTTP_STATUS_CODE = 400 angezeigt:
{
"author_name": [
"This field is required."
]
}
Wenn Sie jedoch den obigen json an /book/update-partial/1/senden, erhalten Sie HTTP_STATUS_CODE = 200 mit der folgenden Antwort:
{
"id": 1,
"name": "PYTHON IN A NUT SHELL",
"author_name": "Alex Martelli"
}
Zu Frage 2. Was ist in der serialisierten Variablen enthalten?
serializedist ein Objekt, das die Modellinstanz als serialisierbares Objekt umschließt. und Sie können diese serialisierte verwenden, um eine einfache JSON-Zeichenfolge mit zu generieren serialized.data.
Zu Frage 3. Wie würde man die Implementierung hier beenden?
Ich denke, Sie können sich selbst antworten, wenn Sie die obige Antwort gelesen haben, und Sie sollten wissen, wann updateund wann Sie sie verwenden müssen partial_update.
Wenn Sie noch Fragen haben, können Sie diese gerne stellen. Ich habe gerade einen Teil der Quell-Oden des Ruhe-Frameworks gelesen und habe einige Begriffe möglicherweise nicht sehr gut verstanden. Bitte weisen Sie darauf hin, wenn es falsch ist ...