2017-12-15 4 views
0

Ich versuche, einfache CRUD-Operation in Django Rest zu implementieren. Ich habe erfolgreich GET und POST erstellt. Nun möchte ich die Zeilendaten mit PUT aktualisieren und eine Zeile mit DELETE löschen.UPDATE und DELETE Operation in Python Django REST

Derzeit sieht mein Tisch wie: -

id item_1 item_2 item_3 date_created date_modified 

1  test1  test2  test3  16-12-2017  16-12-2017 
2  ex1  ex2  ex3  16-12-2017  16-12-2017 

API Endpunkt: - localhost/itemlist

Wenn wir GET localhost/itemlist es die Liste der Elemente zurückgibt.

Wenn wir POST localhost/itemlist mit Feldern item_1, item_2, item_3 erstellen, erstellt es die Zeile.

Jetzt möchte ich PUT verwenden, um eine bestimmte Zeile zu aktualisieren. Wie, wenn ich den Wert von item_3 wo item_1 == "test1"

DELETE sollte die Zeile löschen, wo item_1 == ex1

urls.py

from django.conf.urls import url, include 
from rest_framework.urlpatterns import format_suffix_patterns 
from .views import ItemView 

urlpatterns = { 
    url(r'^itemlists/$', ItemView.as_view(), name="create"),  
} 

urlpatterns = format_suffix_patterns(urlpatterns) 

views.py aktualisieren möchten:

from rest_framework import generics 
from .serializers import itemlistSerializer 
from .models import itemlist 

class ItemView(generics.ListCreateAPIView): 

    queryset = itemlist.objects.all() 
    serializer_class = itemlistSerializer 

    def perform_create(self, serializer): 
     serializer.save() 

Serializer .py

from rest_framework import serializers 
from .models import itemlist 

class itemlistSerializer(serializers.ModelSerializer): 

    class Meta: 
     """Meta class to map serializer's fields with the model fields.""" 
     model = itemlist 
     fields = ('id', 'item_1', 'item_2', 'item_3', 'date_created', 'date_modified') 
     read_only_fields = ('date_created', 'date_modified') 

models.py

from django.db import models 

class itemlist(models.Model): 
    """This class represents the itemlist model.""" 
    item_1 = models.CharField(max_length=255, blank=True, unique=False) 
    item_2 = models.CharField(max_length=255, blank=True, unique=False) 
    item_3 = models.CharField(max_length=255, blank=True, unique=False) 

    date_created = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     """Return a human readable representation of the model instance.""" 
     return "{}".format(self.item_1) 

Antwort

1

Verwenden django Viewsets:

viewsets.py

class ListItemViewSet(viewsets.ModelViewSet): 
    serializer_class = itemlistSerializer 
    queryset = itemlist.objects.all() 
    http_method_names = ['get', 'post', 'put', 'delete', 'option'] 

    def get_queryset(self): 
     request_user = self.request.user 
     if not request_user.is_superuser: 
      return self.queryset.filter(owner=request_user) 

urls.py

router = routers.DefaultRouter() 
router.register(listitem', ListItemViewSet) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
] 

Dann sollten Sie setzen versenden, und Anforderungen löschen Dies funktioniert für Django 1.9x.

Nur noch eine Sache: Bitte lesen Sie die Python Style Guide. Normalerweise verwenden wir CamelCase für Klassennamen.

+1

Gute Antwort, aber Sie müssen die http_method_names nicht definieren. Außerdem gibt es einen Fehler in der Methode get_query_set mit request.user, es sollte self.request.user sein –

+0

Danke für diesen Fehler. Sie haben auch Recht mit http_method_names, aber ich denke, es ist gut, die Methoden explizit festzulegen. Manchmal müssen Sie nur Anfragen zulassen und so können Sie die anderen Methoden deaktivieren. –