Comment patcher un seul champ à l'aide de Django Repos Cadre?
J'ai un modèle "Monmodèle' avec de nombreux champs et je voudrais mettre à jour un champ "statut" à l'aide de PATCH méthode. Je suis l'aide de la classe des vues basées sur les. Est-il possible de mettre en œuvre PATCH?
- vous pouvez simplement vérifier
request.method == 'PATCH'
dans votre afficher le code et ensuite faire ce que vous voulez. - Je voudrais savoir comment gérer cela dans sérialiseur de classe.
- Sérialiseur de classe n'est pas le lieu qui doit savoir quelque chose au sujet de la méthode de requête. Donc, je vous recommande de vérifier les classes d'affichage (comme
APIView
), pas sérialiseurs
Vous devez vous connecter pour publier un commentaire.
Sérialiseurs permettre des mises à jour partielles en spécifiant
partielle=True
lors de l'initialisation de la serialzer. C'est de cette façonPATCH
de traitement des demandes de par défaut dans le générique de vues.Cela vous permettra de mettre à jour les champs individuels dans un sérialiseur, ou tous les champs si vous le voulez, sans aucune des restrictions de la norme
PUT
demande.def update(self, request, *args, **kwargs)
oudef partial_update(self, request, *args, **kwargs)
à l'intérieur de votre point de vue comme Kevin mentionné. La raison que le patch ne fonctionne pas hors de la boîte comme prévu, lorsque vous utilisez ModelSerializer ou Sérialiseur, c'est parce que à l'intérieur deBaseSerializer
constructeur, il y a:self.partial = kwargs.pop('partial', False)
ce qui signifie que même si vous écrasez !!partial_update
!! vous avez encore besoin de passerpartial=True
lors de la création du sérialiseur. Ainsi, le comportement par défaut du générique de points de vue ci-dessus est mis au rebut.ModelSerializer
etRetrieveUpdateDestroyAPIView
. Je suis confus sur où spécifier cepartial=True
!Comme Kevin Brown a déclaré vous pouvez utiliser le
partial=True
, qui chefarov précisé joliment.Je voudrais juste corriger et dire que vous pourriez utiliser des génériques librement, en fonction de la méthode HTTP utilisée:
Si vous utilisez le PATCH méthode HTTP, comme demandé, vous sortir de la boîte. Vous pouvez voir
UpdateModelMixin
code pourpartial_update
:Pour toute méthode HTTP différente de PATCH, ce qui peut être accompli simplement en remplaçant la
get_serializer
méthode comme suit:Cela va créer le sérialiseur que partielle, et le reste des médicaments génériques, fonctionne comme un charme sans aucune intervention manuelle dans la mise à jour/partial_update mécanisme.
Sous le capot
J'ai utilisé le générique:
generics.UpdateAPIView
qui utilise leUpdateModelMixin
qui a ce code:Donc, si vous remplacez la
get_serializer
fonction, vous pouvez effectivement remplacer la partielle de l'argumentation et de la force pour être vrai.Veuillez noter que si vous voulez seulement partielle pour certaines des méthodes HTTP, ce qui rend cette approche plus difficile.
Je suis en utilisant djangorestframework==3.5.3
Il ne semble pas être pris en charge hors de la boîte. Sur votre navigateur API, accédez à un modèle de page de détail, au fond à côté de la
HTML Form
onglet, cliquez surRaw data
, supprimer tout le contenu de la chaîne JSON, sauf le champ ID et le champ que vous voulez modifier, puis cliquez surPATCH
. PartiellePATCH
mise à jour est effectuée.Je suis en utilisant
djangorestframework==3.2.4
, et n'ont pas eu à faire quelque chose pour mon ViewSets et Sérialiseurs pour permettre cela.Dans ce exampe nous mettons à jour l'bool
status_field
champ du modèle, et je suis en utilisant jquery 2.2.1. Ajouter le texte suivant à la<head>
:Puis dans un
<form>
:J'ai choisi de permettre à la case à modifier, puis de revenir en cas d'échec. Mais vous pouvez le remplacer
click
avecmousedown
pour mettre à jour uniquement la case de valeur une fois que l'appel AJAX a réussi. Je pense que cela va conduire à des personnes à plusieurs reprises en cliquant sur la case à cocher pour les connexions lentes si.Si quelqu'un est toujours l'intention de trouver une solution simple à l'aide de
ModelSerializer
sans changer beaucoup de vos points de vue, vous pouvez sous-classe de laModelSerializer
et d'avoir tous vosModelSerializer
s héritent de cette.J'ai eu du mal avec celui-ci pendant un certain temps, mais il est très simple de mise en œuvre de l'utilisation de générique de vues ou une combinaison de vues génériques et mixin.
Dans le cas de l'utilisation d'un générique de mettre à jour la vue (les génériques.UpdateAPIView), il suffit d'utiliser le code suivant, s'assurer que le type de demande est PATCH:
Il n'y a rien d'autre à lui!
Si vous utilisez une mise à jour mixin (mixin.UpdateModelMixin) en combinaison avec une vue générique (génériques.GenericAPIView), utilisez le code suivant, s'assurer que le type de demande est PATCH:
Le deuxième exemple est plus complexe, pour vous montrer comment remplacer le queryset et champ de recherche, mais le code que vous devez prêter attention est le patch de la fonction.