当前位置: 代码迷 >> python >> Django rest框架Router - 如何添加自定义URL和查看功能
  详细解决方案

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

热度:24   发布时间:2023-06-16 10:04:14.0

我正在使用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 

    urls.py

     router = routers.DefaultRouter(trailing_slash=True) router.register(r'mymodels', views.MyModelViewSet) 

让我展示如何使用ViewSetrouter

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

我举一个关于用户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)

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

router = routers.SimpleRouter(trailing_slash=False)
router.register(prefix=r'users', viewset=UserViewSet, base_name='user')

因此会产生相应的网址:

  • listcreate与相应的url: /users
  • retrievepartial_updatedestroy与对应的url: /users/<email>

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

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

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

  • login使用相应的url: /users/login

我希望它可以帮到你。

您可以在视图上使用@detail_route@list_route装饰器向默认路由器添加更多端点。

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

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

定制路由器的很好的解释,以及一个样定制路由器的例子是 。