Django rest framework Router-如何添加自定义URL和视图功能

2024-04-26 14:29:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何设置如下安排:

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

    视图.py

    class MyModelViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer
    

    url.py

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

Tags: djangonamepy框架视图restapi链接
2条回答

让我演示如何使用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)

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

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

因此将生成相应的url:

  • listcreate具有相应的url:/users
  • retrievepartial_updatedestroy具有相应的url:/users/<email>

假设需要添加更多自定义URL,则应使用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/上创建新端点

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

DRF's documentation对自定义路由器以及示例自定义路由器有很好的解释,例如there

相关问题 更多 >