用于更新对象字段的API调用

时间:2016-02-26 04:46:20

标签: python django django-rest-framework

所以我有一个由

组成的模型序列化器
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,我希望能够更新对象的字段idname。有没有办法使用序列化程序使用补丁/发布请求来做到这一点?我是新手,所以如果有人可以帮我解决这个问题我会喜欢它。

我正在考虑做一个POST请求,然后让它执行此操作:

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

但我想使用序列化程序,使用PATCH请求。

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

Django rest框架附带了一些预定义的concrete generic views,例如UpdateAPIViewRetrieveUpdateAPIView

首先,您需要为user创建一个视图,该视图使用其中一个可以update的视图。更新视图为视图提供了patch方法的处理程序。

  

<强> RetrieveUpdateAPIView

     

用于读取或更新端点以表示单个模型实例。

     

提供getputpatch方法处理程序。

现在,使用它来创建一个视图:

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

要访问此视图,您需要有一个使用用户主键访问用户的网址:

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

然后使用PATCH电话,您可以更新用户name

答案 2 :(得分:0)

由于您使用的是ModelViewset,因此应该内置此功能。如果您使用可浏览的API导航到/user/<pk>/,您将看到可以对该对象执行的操作。默认情况下,ModelViewset提供list()retrieve()create()update()destroy()功能。

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

您还可以覆盖任何或所有提供的方法,但是DRF ModelViewsets中内置了单个对象的更新。使用curl尝试使用您要更新的信息到/user/<pk>/的PATCH。