2016-02-26 25 views
3

所以我有它由API調用來更新對象

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'name', 'description') 

的模型串行的領域這是我的視圖集中

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

這是我URLs.py文件:

from django.conf.urls import include, url 
from rest_framework import routers 
import views 

router = DefaultRouter() 
router.register('user', views.UserViewSet) 
urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^login/', include('rest_framework.urls', namespace='rest_framework')) 
] 

使用序列化程序,我可以使它打印出我的數據庫中的對象。如果我有對象PK/ID,我希望能夠更新對象的字段idname。有沒有辦法通過使用序列化器的補丁/發佈請求來做到這一點?我對此很陌生,所以如果有人能幫助我解決這個問題,我很樂意。

我想的只是做一個POST請求,則有它這樣做:

user = User.objects.get(id=id) 
user.name = "XXXXX" 
user.save() 

但我想做到這一點使用串行,使用PATCH請求。

+0

我的回答下面回答你的問題嗎?如果不是,你遇到問題了嗎? – dkhaupt

回答

0

下面的代碼,將有助於你,

**filename : views.py** 

from user.models import User 
from users.serializers import UserSerializer 
from django.http import Http404 
from rest_framework.views import APIView 
from rest_framework.response import Response 
from rest_framework import status 


class UserList(APIView): 
    """ 
    List all users, or create a new user. 
    """ 
    def get(self, request, format=None): 
     users = User.objects.all() 
     serializer = UserSerializer(users, many=True) 
     return Response(serializer.data) 

    def post(self, request, format=None): 
     serializer = UserSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

class UserDetail(APIView): 
    """ 
    Retrieve, update or delete a user instance. 
    """ 
    def get_object(self, pk): 
     try: 
      return User.objects.get(pk=pk) 
     except User.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     user = self.get_object(pk) 
     serializer = UserSerializer(user) 
     return Response(serializer.data) 

    def put(self, request, pk, format=None): 
     user = self.get_object(pk) 
     serializer = UserSerializer(user, data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def delete(self, request, pk, format=None): 
     user = self.get_object(pk) 
     user.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 


**filename : urls.py** 

from django.conf.urls import url 
from rest_framework.urlpatterns import format_suffix_patterns 
from users import views 

urlpatterns = [ 
    url(r'^users/$', views.UserList.as_view()), 
    url(r'^user/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()), 
] 

urlpatterns = format_suffix_patterns(urlpatterns) 

參考:http://www.django-rest-framework.org/tutorial/3-class-based-views/

0

Django的休息框架提供了一些預先定義concrete generic viewsUpdateAPIViewRetrieveUpdateAPIView

首先您需要爲user創建一個視圖,其中使用的視圖之一可以是update。更新視圖爲視圖上的patch方法提供處理程序。

RetrieveUpdateAPIView

用於讀取或更新端點來表示單個模型實例。

提供了get,putpatch方法處理程序。

現在,用它來創建一個視圖:

class UserDetail(generics.RetrieveUpdateAPIView): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

要訪問此視圖,你需要有一個使用用戶的主鍵訪問用戶的URL:

url(r'users/(?P<pk>\d+)/$', UserDetail.as_view(), name='api-user-detail'), 

然後使用PATCH調用您可以更新用戶的name

+0

我認爲你的代碼可以工作,但是OP的代碼使用ModelViewset,默認提供更新功能:http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset – dkhaupt

+0

我同意, generics.RetrieveUpdateAPIView'和'ModelViewSet'使用'mixins.UpdateModelMixin'。所以我認爲OP需要的唯一東西就是帶有'pk'的url。 – AKS

0

由於您使用的是ModelViewset,因此應該內置此功能。如果使用可瀏覽的API導航到/user/<pk>/,您將看到可以在該對象上執行的操作。默認情況下,ModelViewset提供了list()retrieve(),create(),update()destroy()的功能。

http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

您還可以覆蓋任何或所有的提供的方法,但是單個對象的更新內置於DRF ModelViewsets。使用curl嘗試使用您想要更新的信息嘗試PATCH到/user/<pk>/