所以我有一个由
组成的模型序列化器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 :(得分: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,例如UpdateAPIView
,RetrieveUpdateAPIView
。
首先,您需要为user
创建一个视图,该视图使用其中一个可以update
的视图。更新视图为视图提供了patch
方法的处理程序。
<强> RetrieveUpdateAPIView 强>
用于读取或更新端点以表示单个模型实例。
提供
get
,put
和patch
方法处理程序。
现在,使用它来创建一个视图:
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。