2017-09-18 3 views
0

Je souhaite mettre à jour un champ dans mon modèle lorsqu'un lien d'objet est appelé via l'API. J'utilise Django Rest Framework pour gérer la création de l'API.Mise à jour partielle échouée via Viewset Django Rest Framework

du lien à un seul objet est

example.com/api/pk/ where pk is the object id. 

Dans le modèle viewset, j'écrit une méthode de mise à jour partielle pour gérer l'addition de 1 à chaque fois que le champ de l'objet est appelé.

class RocNationViewSet(viewsets.ModelViewSet): 
    queryset=RocNation.objects.filter(is_active=True).order_by('-pub_date') 
    serializer_class=RocNationSerializer 
    filter_backends = (DjangoFilterBackend,) 


    def partial_update(self, request, pk=None): 
     serializer=RocNationSerializer(rocnation, roc_views=F('roc_views')+1, partial=True) 
     serializer.save() 
     return Response(serializer.data) 

La méthode ne réalise pas l'opération. Le champ dans le modèle n'est pas mis à jour. Qu'est-ce que je rate?

+0

-vous utiliser la méthode 'de patch'? –

+0

Non. Comment vais-je m'y prendre? – YoYo

+0

remplacez 'PUT' par' PATCH' dans votre requête –

Répondre

1

il:

@detail_route(methods=['POST','GET']) 
def assign(self, request, pk): 
    rocnation = self.get_object() 
    data = {'roc_views': rocnation.roc_views + 1} 
    serializer = RocNationSerializer(rocnation, data, partial=True) 
    serializer.is_valid(raise_exception=True) 
    serializer.save() 
    return Response(serializer.data) 

visitez donc example.com/api/1/assign

0

C'est ce que vous avez à faire afin de mettre à jour les champs partiels avec Django API Rest:

Dans votre module django:

#create API folder 
mkdir api 

Puis ajouter __init__.py file:

#create __init__.py__ file 
touch __init__.py 

maintenant vous devez créer serializers.py fichier:

from rest_framework import serializers 

from .models import "your model" 
from .views * 

class YourModelUpdateSerializer(serializers.ModelSerializer) : 
    class Meta : 
     model = "your model" 
     fields = [ 
      #list of fields which could be updated 
     ] 

Créer un fichier view.py dans le répertoire API:

from rest_framework.generics import (
    CreateAPIView, 
    UpdateAPIView, 
    DestroyAPIView, 
    ListAPIView, 
    RetrieveAPIView, 
    ) 

from .models import "your model" 

from .serializers import (
    YourModelUpdateSerializer, 
    ) 

class YourModelUpdateAPIView(UpdateAPIView) : 
    queryset = YourModel.objects.all() 
    serializer_class = YourModelUpdateSerializer 

Enfin, ajoutez le fichier urls.py:

from django.conf.urls import url 
from django.contrib import admin 

from .views import (
    YourModelUpdateAPIView, 
    ) 

urlpatterns = [ 
    url(r'^(?P<pk>\d+)/edit/$', YourModelUpdateAPIView.as_view() , name="Update"), 
    ] 

Il devrait fonctionner parce que cela fonctionne dans mon projet;)

Vous avez Django API REST doc here

+0

J'ai déjà des sérialiseurs dans mon dossier d'application Dois-je créer un nouveau dossier pour y parvenir? – YoYo

+0

Vous devez créer un dossier API dans votre module, puis, à l'intérieur, vous pouvez ajouter '__init __ .py',' serializers.py', les fichiers 'views.py' et' urls.py';) Tous ces fichiers selon Django API Rest Framework – Deadpool