Django Rest Framework - @detail_route的详细信息页面

use*_*778 5 django routes detailview django-rest-framework

我在我的viewsets.ModelViewSet上使用@detail_route.

class CompanyViewSet(viewsets.ModelViewSet):
    queryset = Company.objects.all()
    serializer_class = serializers.CompanySerializer

    @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ])
    def accounts(self, request, pk):
    ...
    return Response(...)

# urls.py
router.register(r'companies', views.CompanyViewSet)
Run Code Online (Sandbox Code Playgroud)

这段代码创建了url:

/companies/
/companies/{id}
/companies/{id}/accounts
Run Code Online (Sandbox Code Playgroud)

我不知道如何添加路线/视图到详细帐户:

/companies/{id}/accounts/{id_account}
Run Code Online (Sandbox Code Playgroud)

有没有办法添加路由和视图来处理这条路线?

(最好的选择是在CompanyViewSet上添加)

干杯,

Joc*_*nde 8

DRF本身不处理嵌套路由,您可以手动处理它或使用扩展名,如drf-nested-routers,但它已过时.

我的建议:不要对抗框架,DRF不擅长使用url嵌套资源,以另一种方式做.


sur*_*190 5

所以尽可能避免它......但有时嵌套资源或方法是有意义的

因此,对于您的情况,既要处理accounts/url,accounts/{account_id}又要定义另一个详细路由。

您已经定义了一个 for,accounts因此您只需添加另一个具有不同名称的函数,并确保添加url_path以便您可以获取account_id变量。

        @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ])
        def accounts(self, request, pk):
        ...
        return Response(...)

        @detail_route(methods=['get', ], permission_classes=[IsCompanyUserPermission, ], 
                      url_path='^queues/(?P<account_id>[0-9]+)')
        def account_detail(self, request, pk, account_id):
        ...
        return Response(...)
Run Code Online (Sandbox Code Playgroud)

这个答案以这个类似的答案作为参考