Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django rest框架路由器-如何添加自定义URL和查看功能_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django rest框架路由器-如何添加自定义URL和查看功能

Python Django rest框架路由器-如何添加自定义URL和查看功能,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django Rest框架的默认路由器,并尝试自定义我的链接 如何设置和安排如下内容: class UserViewSet(viewsets.ViewSet): """Userviewset Restful Structure: | URL style | HTTP Method | URL Nanme | Action Function | |----------------|-------------|---------

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

如何设置和安排如下内容:

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)
  • /myModels/dosomething
    (并将其列在API根视图中)
  • /myModels/addModel?name=abc&address=xyz

    视图.py

    class MyModelViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
    router = routers.DefaultRouter(trailing_slash=True)
    router.register(r'mymodels', views.MyModelViewSet)
    
    url.py

    class MyModelViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    
    router = routers.DefaultRouter(trailing_slash=True)
    router.register(r'mymodels', views.MyModelViewSet)
    

  • 通过在视图上使用
    @detail\u route
    @list\u route
    装饰器,可以向默认路由器添加更多端点

    @list\u route
    将在
    /myModel/new route/
    上创建新端点,而
    @detail\u route
    将在
    /myModel//new route/
    上创建新端点

    但是,如果您想完全替换默认路由器提供的端点,您应该考虑编写一个自定义路由器


    对自定义路由器以及示例自定义路由器有很好的解释。

    让我演示如何使用
    ViewSet
    router

    router = routers.SimpleRouter(trailing_slash=False)
    router.register(prefix=r'users', viewset=UserViewSet, base_name='user')
    
    根据,您的视图集需要在类中声明视图

    我给出了一个关于用户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)
    
    因此,将生成相应的URL:

    • 列表
      创建
      具有相应的url:
      /users
    • 检索
      部分更新
      销毁
      都有相应的url:
      /users/
    假设需要添加更多自定义URL,则应使用
    list\u route
    detail\u route
    展开视图集:

    @list_route(methods=['post'])
    def login(self, request):
        """POST - login by user"""
        ...
    
    因此,新操作具有相应的url:

    • login
      具有相应的url:
      /users/login

    我希望它能对您有所帮助。

    您能澄清您的用户详细信息和用户列表对象指的是什么吗?这在DRF 3.8中已被弃用:。您可以改用@action装饰器。