DRF(django-rest-framework)动作装饰器无法正常工作

时间:2018-11-08 23:42:59

标签: python django python-3.x django-rest-framework

我有这个类视图,它非常适合创建和列出SiteGroup的对象:

但是我需要一种方法来对单个SiteGroup对象及其关联的对象执行多项操作。因此,我尝试创建一个用@action装饰的方法(如文档所建议)。

根据文档,这将自动生成中间网址。但是,它不起作用。

当我尝试访问(假设423是现有的SiteGroup对象)时:

http://127.0.0.1:8000/api/site-groups/423/replace_product_id/?product_id=0x345

找不到网址。

我也尝试过自己生成urls.py中的URL,但是没有运气。

有人可以告诉我问题出在哪里吗?我浏览了所有文档,没有发现任何线索。非常感谢。

class SiteGroupDetail(generics.ListCreateAPIView):
    queryset = SiteGroup.objects.all()
    parser_classes = (MultiPartParser, FormParser, JSONParser)
    serializer_class = SiteGroupSerializer
    authentication_classes = (authentication.TokenAuthentication,)

    @action(detail=True, methods=['post'], url_path='replace_product_id', permission_classes=[IsSuperUser], url_name='replace_product_id')
    def replace_product_id(self, request, pk=None, device_type=None):
        serializer = SiteGroupSerializer(data=request.data)
        product_id = self.request.query_params.get('product_id', None)
        print("replace_product", product_id, device_type, pk, flush=True)
        return Response({"hello":product_id})

我的urls.py

from django.conf.urls import url, include

from api import views, routers

router = routers.SimpleRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
enter code here
    url(r'^site-groups/', views.SiteGroupDetail.as_view()),

    url(r'^site-groups/(?P<pk>[0-9]+)/$', views.SiteGroupDetail.as_view()),

]

1 个答案:

答案 0 :(得分:1)

一件事,路由器应该在呼叫

super(OptionalSlashRouter, self).__init__()

您现在所称的SimpleRouter父级的__init__,跳过了SimpleRouter.__init__中的逻辑

对此进行更改,看看它是否开始起作用

实际上,当您使用python 3时,它可能只是

super ().__init__()