J'ai les mêmes questions que le vôtre avant, mais quand j'ai creuser dans le code source de rest_framework, j'ai obtenu les résultats suivants, espérons que cela permettrait de:
Pour la question 1)
Cette question est liée à des verbes HTTP.
METTRE: La méthode PUT remplace toutes les représentations actuelles de la ressource cible, à la demande de la charge utile.
PATCH: Le PATCH méthode est utilisée pour appliquer des modifications partielles à une ressource.
Généralement parlant, partial
est utilisé pour vérifier si les champs du modèle est nécessaire pour la validation de champ lorsque le client de la soumission des données à la vue.
Par exemple, nous avons un Book
modèle comme celui-là, pls note à la fois de l' name
et author_name
champs sont obligatoires (pas de valeur nulle et non vide).
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)
# Create a new instance for testing
Book.objects.create(name='Python in a nut shell', author_name='Alex Martelli')
Pour certains cas, Nous pouvons seulement besoin de mettre à jour une partie des champs dans le modèle, par exemple, nous avons seulement besoin de mettre à jour name
champ dans l' Book
. Donc, pour ce cas, le client ne soumettre l' name
domaine avec une nouvelle valeur à la vue. Les données de soumettre le client peut ressembler à ceci:
{"pk": 1, name: "PYTHON IN A NUT SHELL"}
Mais vous pouvez avoir d'avis que notre définition du modèle ne permet pas l' author_name
à être vide. Donc, il faut utiliser partial_update
au lieu de update
. Donc, le reste du cadre ne sera pas effectuer la validation des champs de case pour les champs qui manque dans les données de la demande.
Pour fins de test, vous pouvez créer deux points de vue pour les deux update
et partial_update
, et vous obtiendrez une plus grande compréhension de ce que je viens de dire.
Exemple:
views.pyfrom 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.pyurlpatterns = 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'),
)
Données à soumettre
{"pk": 1, name: "PYTHON IN A NUT SHELL"}
Lorsque vous envoyez le au-dessus de json à l' /book/update/1/
, vous aurez obtenu l'erreur suivante avec HTTP_STATUS_CODE=400:
{
"author_name": [
"This field is required."
]
}
Mais quand vous soumettre ci-dessus json d' /book/update-partial/1/
, vous aurez obtenu HTTP_STATUS_CODE=200 avec la réponse suivante,
{
"id": 1,
"name": "PYTHON IN A NUT SHELL",
"author_name": "Alex Martelli"
}
Pour la question 2)
serialized
est un objet encapsulant l'instance du modèle comme un serialisable objet. et vous pouvez utiliser cette sérialisé pour générer une plaine chaîne JSON avec serialized.data
.
Pour la question 3)
Je pense que vous pouvez répondre vous-même lorsque vous avez lu la réponse ci-dessus, et vous devriez savoir quand utiliser update
et quand utilisé partial_update
.
Si vous avez encore des question, n'hésitez pas à demander. Je viens de lire une partie de la source des odes de repos cadre, et peut-être pas comprendre très profondément pour certains termes, et merci de nous le signaler quand c'est mal...