Django rest框架Router - 如何添加自定义URL和查看功能

ken*_*gcc 11 python django django-rest-framework

我正在使用Django Rest Framework的默认路由器并尝试自定义我的链接.

如何设置如下所示的排列方式:

  1. /myModels/dosomething(并在API Root视图中列出)
  2. /myModels/addModel?name=abc&address=xyz

    Views.py

    class MyModelViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
    Run Code Online (Sandbox Code Playgroud)

    urls.py

    router = routers.DefaultRouter(trailing_slash=True)
    router.register(r'mymodels', views.MyModelViewSet)
    
    Run Code Online (Sandbox Code Playgroud)

Bur*_*ing 13

让我展示如何使用ViewSetrouter:

根据defaultrouter,您的视图集需要声明类中的视图.

我举一个关于用户api的例子,并指导您如下:

class UserViewSet(viewsets.ViewSet):
    """Userviewset
    Restful Structure:
        | URL style      | HTTP Method | URL Nanme   | Action Function |
        |----------------|-------------|-------------|-----------------|
        | /users         | GET, POST   | user-list   | user_list       |
        | /users/<email> | GET, DELETE | user-detail | user_detail     |
    """
    # Router class variables
    lookup_field = 'email'
    lookup_value_regex = '[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}'

    # Viewsets class variables
    #queryset = User.objects.all()

    def list(self, request):
        """GET - Show all users"""
        print request.version
        api_result = user_list.lists_all_users()
        return Response(api_result)

    def create(self, request):
        """POST - Add new user"""
        api_result = user_list.create_new_user(request.data)
        return Response(api_result)

    def retrieve(self, request, email=None):
        """GET - Show <email> user"""
        api_result = user_detail.retrieve_the_user(email)
        return Response(api_result)

    def partial_update(self, request, email=None):
        return Response()

    def destroy(self, request, email=None):
        """DETELE - Delete <email> user"""
        api_result = user_detail.destroy_the_user(email)
        return Response(api_result)
Run Code Online (Sandbox Code Playgroud)

当我完成包含基本restful api的UserViewSet时,我注册router:

router = routers.SimpleRouter(trailing_slash=False)
router.register(prefix=r'users', viewset=UserViewSet, base_name='user')
Run Code Online (Sandbox Code Playgroud)

因此会产生相应的网址:

  • listcreate与相应的网址:/users
  • retrieve,partial_updatedestroy与相应的网址:/users/<email>

假设您需要添加更多自定义网址,您应该使用list_routedetail_route扩展视图集:

@list_route(methods=['post'])
def login(self, request):
    """POST - login by user"""
    ...
Run Code Online (Sandbox Code Playgroud)

所以新动作是与相应的url:

  • login是与相应的网址: /users/login

我希望它可以帮到你.


ian*_*kit 9

您可以通过在视图上使用@detail_route@list_route装饰器将更多端点添加到默认路由器.

@list_route将创建一个新的端点/myModel/new-route/,而@detail_route将创建新的端点/myModel/<id-of-model>/new-route/

但是,如果要完全替换Default路由器提供的端点,则应考虑编写自定义路由器.

DRF的文档定制路由器的很好的解释,以及一个样定制路由器的例子是.

  • 这在 DRF 3.8 中已弃用:https://www.django-rest-framework.org/community/3.8-announcement/#deprecations。您可以使用 @action 装饰器来代替。 (2认同)