将自定义路由添加到viewsets.ModelViewSet

 烧饼来一个则_815 发布于 2023-01-29 19:34

在文档中有自定义URL的方法示例:http: //www.django-rest-framework.org/tutorial/6-viewsets-and-routers

class SnippetViewSet(viewsets.ModelViewSet):
    ...

    @link(renderer_classes=[renderers.StaticHTMLRenderer])
    def highlight(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

此示例添加以下路由:

url(r'^snippets/(?P[0-9]+)/highlight/$', snippet_highlight, name='snippet-highlight'),

可以添加没有pk param的url,像这样吗?

r'^snippets/highlight/$'

Rahul Gupta.. 10

是的,你可以这样做.只需使用list_route装饰器在视图集中添加您的方法即可.

from rest_framework.decorators import list_route  

class SnippetViewSet(viewsets.ModelViewSet):
    ...

    @list_route(renderer_classes=[renderers.StaticHTMLRenderer])
    def highlight(self, request, *args, **kwargs):
        ...

它将添加一个没有pkparam 的url :

r'^snippets/highlight/$'

您甚至可以使用methods装饰器中的参数指定它支持的方法.

http://www.django-rest-framework.org/api-guide/routers/#usage

2 个回答
  • 该ViewSets文档提用action装饰:

    from rest_framework.decorators import action
    
    
    class SnippetViewSet(viewsets.ModelViewSet):
        ...
    
        @action(detail=False, methods=['GET'], name='Get Highlight')
        def highlight(self, request, *args, **kwargs):
            queryset = models.Highlight.objects.all()
    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
    

    然后只需更新您的queryset即可执行所需的任何操作。

    这样做的好处是保留了序列化。

    如果您urls.py看起来像这样:

    from django.contrib import admin
    from django.urls import path, include
    
    from rest_framework import routers
    from snippets import viewsets
    
    router = routers.DefaultRouter()
    router.register('snippets', viewsets.SnippetViewSet)
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('snippets/', include(router.urls)),
    ]
    

    然后可以通过 http://localhost:8000/snippets/highlights

    要查看的用法POST或如何更改路由,请参阅docs路由器。

    2023-01-29 19:35 回答
  • 是的,你可以这样做.只需使用list_route装饰器在视图集中添加您的方法即可.

    from rest_framework.decorators import list_route  
    
    class SnippetViewSet(viewsets.ModelViewSet):
        ...
    
        @list_route(renderer_classes=[renderers.StaticHTMLRenderer])
        def highlight(self, request, *args, **kwargs):
            ...
    

    它将添加一个没有pkparam 的url :

    r'^snippets/highlight/$'
    

    您甚至可以使用methods装饰器中的参数指定它支持的方法.

    http://www.django-rest-framework.org/api-guide/routers/#usage

    2023-01-29 19:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有