在Django Rest Framework中,我使用自定义方法更新设置了一个视图集:
def update(self, request, pk=None):
if request.user.role == 'admin':
category = get_object_or_404(self.queryset, pk=pk)
serializer = self.serializer_class(category, data=request.data)
if serializer.is_valid:
serializer.save()
return Response(
serializer.data,
status=status.HTTP_200_OK)
return Response(
serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
return Response({
'status': 'Unauthorized',
'message': 'You do not have permission for to do this'
}, status=status.HTTP_401_UNAUTHORIZED)
这不起作用,服务器返回错误500(内部服务器);我使用了以下自定义方法,但更新无效:
class CategoryViewSet(viewsets.ViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = (permissions.IsAuthenticated,)
def list(self, request):
queryset = self.queryset
serializer = self.serializer_class(queryset, many=True)
return Response(serializer.data)
def create(self, request):
serializer = self.serializer_class(data=request.data)
if request.user.role == 'admin':
if serializer.is_valid():
serializer.save()
return Response(
serializer.data,
status=status.HTTP_201_CREATED)
return Response({
'status': 'Bad Request',
'message': 'We cannot create this category'
}, status=status.HTTP_400_BAD_REQUEST)
return Response({
'status': 'Unauthorized',
'message': 'You are not a administrator'
}, status=status.HTTP_401_UNAUTHORIZED)
def retrieve(self, request, pk=None):
category = get_object_or_404(self.queryset, pk=pk)
serializer = self.serializer_class(category)
return Response(serializer.data)
def update(self, request, pk=None):
if request.user.role == 'admin':
category = get_object_or_404(self.queryset, pk=pk)
serializer = self.serializer_class(category, data=request.data)
if serializer.is_valid:
serializer.save()
return Response(
serializer.data,
status=status.HTTP_200_OK)
return Response(
serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
return Response({
'status': 'Unauthorized',
'message': 'You do not have permission for to do this'
}, status=status.HTTP_401_UNAUTHORIZED)
def destroy(self, request, pk=None):
pass
如您所见,方法列表,方法创建和方法检索工作,但不更新。
有什么问题?