当前位置: 首页 > 知识库问答 >
问题:

无法在Django rest框架ModelViewSet中实现PUT

窦哲彦
2023-03-14

我有一个使用ModelViewSet实现的模型。在这种情况下,GET and POST工作得很好。但是当我定义PUT时,我在rest客户机中得到以下响应:

{
"status": false,
"errors": [],
"exception": "Method \"PUT\" not allowed."
}
 class OrganizationViewSet(viewsets.ModelViewSet):
queryset = Organization.object.all()
serializer_class = OrganizationSerializer

def get_queryset(self):
    if not self.isUserAuthorized(self.request.user):
        return Response(str("forbidden"), status=status.HTTP_403_FORBIDDEN)

    return self.queryset

def create(self, request):
    if not self.isUserAuthorized(self,request.user):
        return Response(str("forbidden"), status=status.HTTP_403_FORBIDDEN)

    org = self.request.data['name']
    result = Organization.object.create_organization(org)
    if not result:
        return Response(str("error in creating organization"), status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(OrganizationSerializer(result).data, status=status.HTTP_201_CREATED)

def update(self):
    pass

urls.py

router = routers.DefaultRouter()
router.register(r'api/v1/organization', OrganizationViewSet )
urlpatterns = [
    # url(r'^', include(router.urls)),
]

有没有人可以建议我应该如何在这里实现update方法,以便下面的请求可以工作:

PUT localhost:8000/api/v1/organization/:id

Param in JSON(application/json) {
                                 "name = "new_name"
                                }

共有1个答案

鄂琛
2023-03-14

这就是我使用update()的方法。对于partial_update,您需要在get_serializer()中使用partial=true。希望它在将来对人们有所帮助。

编辑:在views.py中完成我的viewset类并设置格式。

class MonitorViewSet(viewsets.ModelViewSet):
    permission_classes_by_action = MyRestrictedViewPermissions
    queryset = models.Monitor.objects.all().order_by('monitor_name')
    serializer_class = serializers.MonitorSerializer
    def update(self, request, *args, **kwargs):
            instance = self.get_object()
            # serializer = self.get_serializer(data=request.data,many=isinstance(request.data, list), partial=True)
            serializer = self.get_serializer(instance, data=request.data)
            serializer.is_valid(raise_exception=True)

            if request.user.has_perm('change_monitor', instance):
                instance = serializer.save()
                self.perform_update(instance)
                headers = self.get_success_headers(serializer.validated_data)
                return Response(serializer.data, status=status.HTTP_206_PARTIAL_CONTENT, headers=headers)
            else:
                return HttpResponseForbidden('Somehow, you aren\'t authorized to update')

    def partial_update(self, request, *args, **kwargs):
        instance = self.get_object()
        #serializer = self.get_serializer(data=request.data,many=isinstance(request.data, list), partial=True)
        serializer = self.get_serializer(instance, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)

        if request.user.has_perm('change_monitor',instance):
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_206_PARTIAL_CONTENT, headers=headers)
        else:
            return HttpResponseForbidden('Somehow, you aren\'t authorized to partial update')
 类似资料:
  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 问题内容: 我想提供两个不同的序列化器,但仍然可以从以下所有功能中受益: 当查看对象列表时,我希望每个对象都有一个重定向到其详细信息的url,并使用目标模型来显示其他所有关系。 例: 查看对象的详细信息时,我想使用默认值 例: 我设法按照以下方式完成了所有这些工作: serializers.py views.py 基本上,我会检测用户何时请求列表视图或详细视图,并进行更改以满足我的需求。不过,我对

  • 通过使用Java语言实现一个完整的框架设计,这个框架中主要内容有第一小节介绍的Web框架的结构规划,例如采用MVC模式来进行开发,程序的执行流程设计等内容;第二小节介绍框架的第一个功能:路由,如何让访问的URL映射到相应的处理逻辑;第三小节介绍处理逻辑,如何设计一个公共的 调度器,对象继承之后处理函数中如何处理response和request;第四小节至第六小节介绍如何框架的一些辅助功能,例如配置

  • 我希望提供两种不同的序列化程序,同时又能够从的所有功能中获益: 当查看对象列表时,我希望每个对象都有一个重定向到其详细信息的url,并且使用目标模型的显示所有其他关系; 示例: 查看对象的详细信息时,我希望使用默认的 示例: 我设法通过以下方式使这一切如我所愿发挥作用: serializers.py views.py 基本上,我会检测用户何时请求列表视图或详细视图,并根据需要更改。我对这段代码并不

  • 本文向大家介绍tp5框架无刷新分页实现方法分析,包括了tp5框架无刷新分页实现方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了tp5框架无刷新分页实现方法。分享给大家供大家参考,具体如下: 已tp5 分页为例, 1.默认生成的分页 页码如下: 2.点击页码  值,跳转到对应的页面,并get传 page='1' or '2'; 所以无刷新需要做到两点,阻止页码 a链接跳转 和 传值【

  • 就像Flask拥有来实现迁移一样。猎鹰有类似烧瓶的东西吗?