Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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 DjangoRestFramework:为ModelViewSet的单独函数创建单独的URL_Python_Django_Django Rest Framework_Django Urls_Django Rest Viewsets - Fatal编程技术网

Python DjangoRestFramework:为ModelViewSet的单独函数创建单独的URL

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) 我希望此视图集的创建、更新、列表和检索功能使用

我在Django Rest框架中有一个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)
/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,除非指定为参数:
,但在任何情况下都可能不需要。。