扩展一个知识点: 在Django中,代码只要顶格编写,程序一运行,代码将直接执行。
drf路由Routers
自动生成路由需要继承ViewSetMixin子类,重写了as_view()方法。

导入模块:
| from rest_framework import routers |
创建router对象,并注册视图集合,例如:
| router = SimpleRouter() |
| router.register('books', views.BookAPIView) |

参数解析:
| register(prefix, viewset, basename=None) |
| |
| |
| |
| |
上述代码会形成的路由如下:
| [ |
| <URLPattern '^books/$' [name='books-list']>, |
| <URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']> |
| ] |
添加路由数据具有两种方式:
第一种写路由的模式:
url.py
| urlpatterns = [ |
| |
| path('books/', views.BookAPIView.as_view({'get':'list'})), |
| path('books/<int:pk>', views.BookAPIView.as_view({'get':'retrieve'})), |
| ] |
| |
| urlpatterns += router.urls |
第二种书写路由的模式:
url.py
| urlpatterns = [ |
| path('api/',include(router.urls)) |
| ] |
此时客户端发送请求: http://127.0.0.1:8000/api/books/
Views.py,两种数据添加方式视图层书写方式一致。
| from rest_framework.viewsets import ModelViewSet |
| |
| |
| class BookAPIView(ModelViewSet): |
| queryset = Books.objects.all() |
| serializer_class = BookSerializers |
路由router形成URL的方式
路由之DefaultRouter()
导入模块:
| from rest_framework.routers import DefaultRouter |
url.py
| router = DefaultRouter() |
| router.register('books', views.BookAPIView) |
| """ |
| [ |
| <URLPattern '^books/$' [name='books-list']>, |
| <URLPattern '^books\.(?P<format>[a-z0-9]+)/?$' [name='books-list']>, |
| <URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']>, |
| <URLPattern '^books/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='books-detail']>, |
| <URLPattern '^$' [name='api-root']>, <URLPattern '^\.(?P<format>[a-z0-9]+)/?$' [name='api-root']> |
| ] |
| """ |
| print(router.urls) |
| |
| urlpatterns = [ |
| path('',include(router.urls)) |
| ] |
views.py
| from rest_framework.viewsets import ModelViewSet |
| |
| |
| class BookAPIView(ModelViewSet): |
| queryset = Books.objects.all() |
| serializer_class = BookSerializers |

路由之SimpleRouter()
导入模块:
| from rest_framework.routers import SimpleRouter |
url.py
| from rest_framework.routers import SimpleRouter,DefaultRouter |
| from django.urls import path,include |
| |
| |
| router = SimpleRouter() |
| router.register('books', views.BookAPIView) |
| """ |
| [ |
| <URLPattern '^books/$' [name='books-list']>, |
| <URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']> |
| ] |
| """ |
| print(router.urls) |
views.py
| from rest_framework.viewsets import ModelViewSet |
| |
| |
| class BookAPIView(ModelViewSet): |
| queryset = Books.objects.all() |
| serializer_class = BookSerializers |

不会产生根路由。
- DefaultRouter与SimpleRouter的区别是:
- DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。
视图层自定义方法,路由映射方法。
第一种模式,手动编写路由。
url.py
| from rest_framework.routers import SimpleRouter |
| from django.urls import path,include |
| |
| |
| router = SimpleRouter() |
| router.register('books', views.BookAPIView) |
| |
| |
| urlpatterns = [ |
| path('books/',views.BookAPIView.as_view({'get':'login'})), |
| path('',include(router.urls)) |
| ] |
views.py
| class BookAPIView(ModelViewSet): |
| queryset = Books.objects.all() |
| serializer_class = BookSerializers |
| |
| |
| def login(self, request, *args, **kwargs): |
| |
| |
| return Response("查询成功") |

第二种模式,自动路由如何自定义方法之装饰器action。
导入模块:
| from rest_framework.decorators import action |
url.py
| from rest_framework.routers import SimpleRouter,DefaultRouter |
| from django.urls import path,include |
| |
| |
| router = SimpleRouter() |
| router.register('books', views.BookAPIView) |
| |
| |
| urlpatterns = [ |
| path('',include(router.urls)) |
| ] |
views.py
| from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, GenericViewSet, ViewSet |
| from rest_framework.decorators import action |
| |
| |
| class BookAPIView(ModelViewSet): |
| queryset = Books.objects.all() |
| serializer_class = BookSerializers |
| |
| |
| @action(methods=['GET'],detail=False,url_path='login') |
| def login(self, request, *args, **kwargs): |
| return Response(request.data) |
action参数:

- methods: 声明该action对应的请求方式,列表传递
- detail: 声明该action路径是否为单一资源对应(False查询所有数据接口,True查询单条数据接口)
| @action(methods=['GET'], detail=False, url_path='login') |
| def login(self, request, *args, **kwargs): |
| print(kwargs) |
| return Response(request.data) |
| |
| |
| |
| ^books/login/$ |
| |
| ^books/(?P<pk>[^/.]+)/login/$ |
action同样也需要视图层继承ViewSetMixin
总结:
| |
| * -需要继承ViewSetMixin+9个视图子类 |
| * -需要继承ViewSetMixin+视图类(APIView,GenericAPIView)+5个视图扩展类 |
| |
| ViewSetMixin+视图类 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了