2016-02-26 3 views
3

Так у меня есть модель сериалайзер, которая состоит изAPI вызова, чтобы обновить поле объекта

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

Это мой Viewset

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, я хочу иметь возможность обновлять поле id или name объекта. Есть ли способ, который я могу сделать с помощью запроса патча/сообщения с помощью сериализатора? Я новичок в этом, поэтому мне бы это понравилось, если кто-то может помочь мне в этом.

Я имею в виду только что делать 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 views, таких как UpdateAPIView, RetrieveUpdateAPIView.

Для начала необходимо создать представление для user, которое использует одно из видов, которое может update. Представления обновления предоставляют обработчики для метода patch в представлении.

RetrieveUpdateAPIView

Используется для конечных точек для чтения или обновления для представления одного экземпляра модели.

Предоставляет get, put и patch обработчики методов.

Теперь использовать это, чтобы создать представление:

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, это URL с 'pk' в нем. – 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>/ с информацией, которую вы хотите обновить.

Смежные вопросы