Python DjangoRestFramework:为ModelViewSet的单独函数创建单独的URL
我在Django Rest框架中有一个ModelViewset:Python DjangoRestFramework:为ModelViewSet的单独函数创建单独的URL,python,django,django-rest-framework,django-urls,django-rest-viewsets,Python,Django,Django Rest Framework,Django Urls,Django Rest Viewsets,我在Django Rest框架中有一个ModelViewset: class UserViewset(viewsets.ModelViewSet): queryset = models.User serializer_class = serializers.User 其路由器: router = routers.DefaultRouter() router.register(r'user', views.UserViewset) 我希望此视图集的创建、更新、列表和检索功能使用
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)
/user/register/:POST(创建新用户)
/用户//配置文件:获取(检索用户的配置文件)
/用户//配置文件/更新/:修补程序(更新用户配置文件)
/用户/列表:获取(获取用户列表)
如何实现这一点(使用路由器或URL)?您可以通过以下方式实现:
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
...
来自rest\u framework.decorators导入操作
类UserViewset(viewsets.ModelViewSet):
queryset=models.User
serializer\u class=序列化程序。用户
#获取:/user/注册/
@操作(detail=False,url_path='register/'))
def用户_寄存器(自身,请求):
...
#获取:/user//profile
@操作(detail=True,methods=['get'])
def配置文件(自我、请求、主键=无):
...
#补丁:/user//profile/更新/
@操作(detail=True,methods=['patch'],url\u path='profile/update/'))
def配置文件_更新(自我、请求、主键=无):
...
#获取:/user/list
@操作(detail=False,url_path='list/'))
def用户列表(自我、请求、*args、**kwargs):
#您可以在这里执行super().list(请求、*args、**kwargs),由您决定
...
您可以从以下网站了解更多信息:
一种方法是为每个视图创建更多视图,而不是使用布线,然后使用路径<代码>路径('/user/register/',views.register.as_view(),name='user-register')。然后仅在register视图中处理POST请求。是否可以为相同的viewset函数定义单独的URL?是的,请尝试使用
路径('/user/..',views.UserViewset.as_view(),name='user-..')
。我不知道如何使用实际的url,除非指定为参数:
,但在任何情况下都可能不需要。。