首页 > 其他分享 >drf : 自动生成路由,视图层自定义方法,路由映射方法,action参数。

drf : 自动生成路由,视图层自定义方法,路由映射方法,action参数。

时间:2024-03-25 11:44:05浏览次数:35  
标签:自定义 BookAPIView 视图 books import router 路由

扩展一个知识点: 在Django中,代码只要顶格编写,程序一运行,代码将直接执行。

drf路由Routers

自动生成路由需要继承ViewSetMixin子类,重写了as_view()方法。

导入模块:

from rest_framework import routers

创建router对象,并注册视图集合,例如:

router = SimpleRouter()
router.register('books', views.BookAPIView)

参数解析:

register(prefix, viewset, basename=None)

# 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
此时访问: http://127.0.0.1:8000/,为根路由。

路由之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):
        # 客户端发送的GET请求
        # print(request)
        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) #{'pk':1}
  return Response(request.data)


# detail=False
^books/login/$
# detail=True
^books/(?P<pk>[^/.]+)/login/$

action同样也需要视图层继承ViewSetMixin

总结:

# 自动生成路由的视图类
* -需要继承ViewSetMixin+9个视图子类
* -需要继承ViewSetMixin+视图类(APIView,GenericAPIView)+5个视图扩展类
# 可以使用action的视图类
ViewSetMixin+视图类

标签:自定义,BookAPIView,视图,books,import,router,路由
From: https://www.cnblogs.com/HeroZhang/p/18094054

相关文章

  • drf : 通用视图类和(GenericAPIView)5个视图扩展类,九个视图子类,视图集。
    视图RESTframework提供了众多的通用视图基类与扩展类,以简化视图的编写。APIViewrest_framework.views.APIViewAPIView是RESTframework提供的所有视图的基类,继承自Django的View父类。GenericAPIView使用[通用视图类]继承自APIVIew,主要增加了操作序列化器和数据库查询的方......
  • 自定义异常以及统一处理自定义返回值
    需求,@ResponseStatus注解无法自定义返回值,所以放弃 实现/***自定义异常类*/publicclassMyExceptionextendsRuntimeException{//异常信息privateStringmessage;//构造函数publicMyException(Stringmessage){super(message);......
  • Django 中间件以及自定义中间件
    Django中间件Django中间件是Django的门户请求来的时候需要先经过中间件才能达到真正的Django后端响应走的时候最后也要经过中间件才能发送出去MIDDLEWARE=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddle......
  • Qt6.0开发 第五章 模型-视图结构
    第五章模型-视图结构模型-视图结构概述模型-视图结构是一种将数据存储和界面分离的编程方法.模型存储数据,视图组件显示模型中的数据,在视图组件里修改的数据会被自动保存到模型里.GUI程序的主要功能是可由用户在界面上编辑和修改数据,典型的如数据库应用程序.在数据库应用程......
  • IDEA自定义注解配置
    一、类注释一、类注释1、打开设置打开设置:Settings->Editor->FileandCodeTemplates,如下图。FileHeader.java为引用的模板文件类头文件注释模板(FileHeader.java)/***@title${NAME}*@date${DATE}${TIME}*@authorbxc*@descriptionTODO*/二、......
  • vue2 defineComponent 自定义组件的强大功能
    完全可以通过向defineComponent()传入一个选项式API所定义的object,来定义一个组件,并包含各种响应式功能;如下About组件所示:<scriptsetup>import{ref,computed,defineComponent}from'vue'constHome=defineComponent({template:`<h1>Home</h1>`})constAbo......
  • 系统学习Python——装饰器:“私有“和“公有“属性案例-[为Python3.X重定义运算符重载
    分类目录:《系统学习Python》总目录自然地,之前的文章中的两个混合器父类变体都可以通过代码的一些额外变化来改进。除了两个值得简要关注的变体外,这里我们将略过大部分。首先,下面比较第一个混合方案的变种一一其使用了更加简单的编程结构,但是这也导致每次内置操作都增加一......
  • 空战博弈实现——3 gym自定义环境
    gym1——自定义Gym环境并注册目录gym1——自定义Gym环境并注册感谢开始Step0新建文件夹Step1:新建环境文件xxEnv.pyStep2:在env下的__init__.py下注册**Step3**添加新建环境文件夹的引用Step4:在算法中进行调用感谢强化学习实战第一讲gym学习及二次开发-知乎(zhih......
  • C# wpf 实现自定义撤销重做功能
    新建wpf项目,新建Undoable.cs(操作记录),main.xaml(页面)usingSystem;usingSystem.Collections.Generic;namespaceWpfApp1{///<summary>///撤销重做对象///ceatebyxin2022.6.26///2023.9.13去除Step的定义替换为KeyValuePair简化实现///</summ......
  • 构建自定义颜色的SolidColorBrush
    ①System.Windows.Media.Brushes.BlueViolet;②newSystem.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(0X8A,0X2B,0XE2));③newSystem.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromArgb(0XFF,0X8A,0X2B,0XE2));//完全......