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:<param>
,但在任何情况下这都不是必需的..
【参考方案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 模型结构添加自定义管理器?