一: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)
浙公网安备 33010602011771号