首页 > 其他分享 >DRF之路由

DRF之路由

时间:2022-12-27 15:58:32浏览次数:39  
标签:set get BookInfoViewSet book pk 路由 DRF

DRF之路由控制

  • 参考网址

https://www.cnblogs.com/yangyi215/p/15041610.html

  • 引入场景,继承 ModelViewSet 快速实现'增删改查',手动配置路由
# views
# ModelViewSet内部实现了5个方法
'''
    - 'get':'retrieve'(传pk),'get':'list'

    - 'post':'create'

    - 'put':'update'(传pk)

    - 'delete':'destroy'(传pk)

    
'''
class BookInfoViewSet(ModelViewSet):
    authentication_classes = []
    permission_classes = []

    queryset = BookInfo.objects.get_queryset()
    serializer_class = BookInfoserializer

### urls
......
urlpatterns = [
    ......
    # viewset
    url(r'^book_set/(?P<pk>\d+)', views.BookInfoViewSet.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
    url(r'^book_set/', views.BookInfoViewSet.as_view(actions={'get':'list','post':'create'})),
]

  • 如果觉得配置路由的方法,有点繁琐,那么我们有没有更简单的配置路由的方式?
    DRF提供了一种更简单的配置路由的方式
    自动生成继承视图类ModelViewSet的路由,书写方式如下
from django.conf.urls import url
# 导入 routers模块
from rest_framework import routers

# 生成 router实例
router = routers.SimpleRouter()
# 调用register('前缀','继承自ViewSet视图类','别名')方法注册,自动生成路由
router.register(prefix='book_set',viewset=views.BookInfoViewSet,basename='book_set')
# router.urls: [<URLPattern '^book_set/$' [name='book_set-list']>, <URLPattern '^book_set/(?P<pk>[^/.]+)/$' [name='book_set-detail']>]


urlpatterns = [
    ......
    # viewset
    # url(r'^book_set/(?P<pk>\d+)', views.BookInfoViewSet.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
    # url(r'^book_set/', views.BookInfoViewSet.as_view(actions={'get':'list','post':'create'})),
]

# 加入原路由
urlpatterns += router.urls

- 效果: 和原来一模一样

- 注意事项,自动路由还有一个 router = routers.DefaultRouter()
  步骤和上面一样,会生成6个路由(用得比较少)

  • 虽然现在能够自动化,生成路由,但是又引出一个问题
    如果我们想给继承自ModelViewSet的视图类中定义的函数也添加路由,那么我们该如何操作呢
    这就引出了action装饰器
    如果我们直接在类中添加自定义函数,是不会自动添加路由的,可以这么干

class BookInfoViewSet(ModelViewSet):
    authentication_classes = []
    permission_classes = []

    queryset = BookInfo.objects.get_queryset()
    serializer_class = BookInfoserializer

    @action(methods=['get'], detail=True)
    # def get_data(self, request, pk):
    def get_data(self, request, *args,**kwargs):
        # print(pk)
        queryset = self.get_queryset()[0:2]  # 切片:截取两条数据
        serializer = self.get_serializer(instance=queryset, many=True)
        return Response(serializer.data)

'''
- 返回同样的数据,一个带pk,一个不带pk

    - detail=False 不带pk

        - http://127.0.0.1:8888/tests/book_set/get_data/

            - 返回id为1和2的数据

    - detail=True 带pk【固定写法,如果想改重写内部参数即可】

        - http://127.0.0.1:8888/tests/book_set/1/get_data/

            - - 返回id为1和2的数据
'''

标签:set,get,BookInfoViewSet,book,pk,路由,DRF
From: https://www.cnblogs.com/qinganning/p/17008222.html

相关文章

  • 服务网关zuul之七:zuul中的动态刷新路由配置
    SpringCloud实战小贴士:Zuul处理Cookie和重定向所以解决该问题的思路也很简单,我们只需要通过设置sensitiveHeaders即可,设置方法分为两种:全局设置:​​zuul.sensitive-heade......
  • nginx 一个端口 多路由配置多项目 https 配置项
    #usernobody;userroot;worker_processes1;worker_rlimit_nofile51200;events{useepoll;worker_connections51200;multi_accepton;}http{i......
  • Vue路由
    VueRouter一、对前端路由的理解路由:路由是url到函数的映射,可以根据不同的url地址展示不同的内容或页面。服务器端路由(后端路由)对于服务器来说,当接收到客户端发......
  • vue-router 路由
    安装及引入//安装npmivue-router//引入main.js...importVueRouterfrom"vue-router"...Vue.use(VueRouter)...newVue({router,//Vue实例上创......
  • 路由注解
    vue路由//默认没有菜单varisMenu=false//路由跳转前触发router.beforeEach((to,from,next)=>{//加载进度条开始NProgress.start()//去获取缓存中......
  • springcloud gateway根据服务名称进行路由失败There was an unexpected error (type=S
    出现错误,如下图:解决办法:检查自己的yaml文件:server:port:88spring:application:name:applicationNamecloud:nacos:discovery:se......
  • Flask 动态路由转换器
      fromflaskimportFlaskapp=Flask(__name__)@app.route('/user/<name>')defshow_user(name):return'Mynameis%s'%[email protected]('/age/<i......
  • 如何在路由绑定中使用 IParsable
    IParsable是.Net7中新增的接口,它可以将字符串转换为对应的实体。在Controller的Route绑定中可以使用IParsable来绑定复杂的实体。实验背景假设有一个需要将ro......
  • 子应用中的urls路由
    fromdjango.conf.urlsimporturlfrombook.viewsimportindex,detail,set_cookie,get_cookie,set_session,get_sessionfrombook.viewsimportBookView,CenterVie......
  • Flask - 动态路由和debug模式
    一、前言参考https://www.cnblogs.com/poloyy/p/14994738.html前面几篇文章讲的路由路径都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处......