DjangoRestFramework : 为 ModelViewSet 的单独功能创建单独的 URL

Posted

技术标签:

【中文标题】DjangoRestFramework : 为 ModelViewSet 的单独功能创建单独的 URL【英文标题】:DjangoRestFramework : Create separate URLs for separate functions of ModelViewSet 【发布时间】:2021-08-27 20:03:42 【问题描述】:

我在 Django Rest Framework 中有一个 ModelViewset:

class UserViewset(viewsets.ModelViewSet):
    queryset = models.User
    serializer_class = serializers.User

它的路由器:

router = routers.DefaultRouter()
router.register(r'user', views.UserViewset)

我想要此视图集的创建、更新、列出和检索功能的单独 URL:

/user/register/            : POST (create new user)
/user/<pk>/profile         : GET (retrieve profile of user)
/user/<pk>/profile/update/ : PATCH (update profile of user)
/user/list                 : GET (get list of users)

如何实现(使用路由器或 URL)?

【问题讨论】:

一种方法是为每个视图创建更多视图,而不是使用路由然后使用路径。 path('/user/register/', views.register.as_view(), name='user-register')。然后只在注册视图中处理 POST 请求。 难道不能为同一个视图集函数定义不同的 URL 吗? 是的,试试path('/user/...', views.UserViewset.as_view(), name='user-..')。除非指定为参数,否则我不确定如何使用实际 url:&lt;param&gt;,但在任何情况下这都不是必需的.. 【参考方案1】:

你可以这样做:

from rest_framework.decorators import action


class UserViewset(viewsets.ModelViewSet):
    queryset = models.User
    serializer_class = serializers.User

    # GET: /user/register/
    @action(detail=False, url_path='register/')
    def user_register(self, request):
        ...

    # GET: /user/<pk>/profile
    @action(detail=True, methods=['get'])
    def profile(self, request, pk=None):
        ...

    # PATCH: /user/<pk>/profile/update/
    @action(detail=True, methods=['patch'], url_path='profile/update/')
    def profile_update(self, request, pk=None):
        ...

    # GET: /user/list 
    @action(detail=False, url_path='list/')
    def user_list(self, request, *args, **kwargs):
        # You can do super().list(request, *args, **kwargs) here, up to you
        ...

您可以从以下网址了解更多信息:

https://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing https://www.django-rest-framework.org/api-guide/routers/#routing-for-extra-actions

【讨论】:

以上是关于DjangoRestFramework : 为 ModelViewSet 的单独功能创建单独的 URL的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 & Django Rest Framework - 如何查询 M-1-M 模型?

Python 3 Django Rest Framework - 如何向这个 M-1-M 模型结构添加自定义管理器?

djangorestframework-jwt 不适合 http、https 吗?

django drf JWT

djangorestframework:过滤相关字段

04: DjangoRestFramework使用