飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一:ViewSetMixin方法的原理:

1:django原有的路由分发逻辑:
在这里插入图片描述
2:ViewSetMixin源码分析:
在这里插入图片描述
3:django和DRF框架路由流程:
在这里插入图片描述

二:DRF的自动映射路由:(SimpleRouter或者DefaultRouter):

1: 流程:
实例化路由对象—>注册视图集(指定映射规则)—>把生成的路由映射到路由表中。

2:自动映射路由:

# 实例化路由对象
router = SimpleRouter()
# 指定映射规则:prefix->前缀, viewset ->要映射的视图, base_name :其别名用于路由反解析
router.register(prefix="books", viewset=BookView, base_name="books")
#router.urls :得到的是路由列表 [repath(),repath(),....]
#路由列表的合并:extend
urlpatterns.extend(router.urls)

三:SimpleRouter或者DefaultRouter的区别:

1:先看SimpleRouter 得到的所有路由:
在这里插入图片描述
2:再看DefaultRouter得到的路由:

在这里插入图片描述
3:区别:
3.1:看第六条信息:发现DefaultRouter,帮我们生成了一个跟路由:也就是127.0.0.1:8000/ —>SimpleRouter会报错,DefaultRouter不会,会返回一个跟路由,如下图:
在这里插入图片描述
3.2:看第三条可以发现:DefaultRouter,生成一个路由可以让我们返回固定格式:比如:127.0.0.1:8000/books.json ,则DFS就只会返回json格式,不会返回别的数据格式。

四:action装饰器

场景:上面路由映射存在问题,他不会映射我们自己定义的,如何解决这个问题?action装饰器。

methods : 请求的方式
url_path: 路径 的尾缀,如果不写默认是方法的名字。
detail : 如果是True: 路径= 前缀(prefix)+ pk正则分组 + 尾缀
如果是Fase: 路径= 前缀 + 尾缀

class BookView(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializers

    @action(methods=['get'],detail=False, url_path="latest")
    def latest(self, request, *args, **kwargs):
        book = self.queryset.latest('bpub_date')
        serializers = self.get_serializer(instance=book)
        return Response(data=serializers.data)
posted on 2020-09-22 21:40  飞行的猪哼哼  阅读(23)  评论(0)    收藏  举报