IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> DRF-视图集ModelViewSet和自定义路由 -> 正文阅读

[Python知识库]DRF-视图集ModelViewSet和自定义路由

一、ModelViewSet继承的是GenericViewSet,和五个拓展类,所以它的写法如下:


class Books(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

?路由匹配:

url(r'^book_drf/$', modelviewset_view.Books.as_view({'get': 'list', 'post': 'create'})), url(r'^book_drf/(?P<pk>\d+)/$', modelviewset_view.Books.as_view({'put': 'update', 'get': 'retrieve', 'delete': 'destroy'})),


from django.urls import path
from django.conf.urls import url
from book_drf import views, apiview_view, viewset_view, genericviewset_view, modelviewset_view

urlpatterns = [
    # url(r'^book_drf/$', apiview_view.as_view()),
    # url(r'^book_drf/(?P<pk>\d+)/$', apiview_view.as_view()),
    # url(r'^books_drf/(?P<pk>\d+)/$', apiview_view.BookDRFView.as_view()),
    # ViewSet的路由使用方式
    # url(r'^book_drf/$', viewset_view.Books.as_view({'get': 'list', 'post': 'create'})),
    # url(r'^book_drf/(?P<pk>\d+)/$', viewset_view.BookDRFView.as_view({'put': 'update'})),
    # url(r'^book_drf/(?P<pk>\d+)/lastdata/$', viewset_view.BookDRFView.as_view({'get': 'lastdata'})),

    # GenericViewSet的路由使用方式
    # url(r'^book_drf/$', genericviewset_view.Books.as_view({'get': 'list', 'post': 'create'})),
    # url(r'^book_drf/(?P<pk>\d+)/$', genericviewset_view.BookDRFView.as_view({'put': 'update'})),
    # url(r'^book_drf/(?P<pk>\d+)/lastdata/$', genericviewset_view.BookDRFView.as_view({'get': 'lastdata'})),

    # ModelViewSet的路由使用方式
    url(r'^book_drf/$', modelviewset_view.Books.as_view({'get': 'list', 'post': 'create'})),
    url(r'^book_drf/(?P<pk>\d+)/$', modelviewset_view.Books.as_view({'put': 'update',
                                                                     'get': 'retrieve',
                                                                     'delete': 'destroy'})),

]

路由匹配的实际方法,从books看是没有,但是点进去看ModelViewSet看是从这继承的

?进入ListModelMixin里可以看到,这个类里面有个list方法,其他增删改查同理。

二、对拓展类里的名称,自定义路由

自定义的路由使用的前提,这个类视图是视图集,如果不是视图集是不能用的。

1、首先引入这个类

from rest_framework.routers import SimpleRouter,?DefaultRouter

还有一个DefaultRouter ,有根目录首页匹配功能,如果访问的是http://127.0.0.1可以匹配,如果是SimpleRouter 访问http://127.0.0.1/ 必须加上/,可以从源码上看出,DefaultRouter继承了SimpleRouter。点SimpleRouter的源码可以看下,它已经封装好了方法,做一一映射。

然后初始化生成路由对象

router = SimpleRouter()

router对象下面有个registry方法,用于生成路由对象

第一个参数是资源名字,第二个参数是哪个视图文件下的那个类视图,第三个参数是路由命名

router.registry('book_drf', modelviewset_view.Books, base_name='books')

生成后的路由信息,可以通过一个打印方法看下

print(router.urls)

最后是把这个列表加到一起

urlpatterns +=router.urls

from rest_framework.routers import SimpleRouter, DefaultRouter

# 自定义路由
router = SimpleRouter()
router.registry('book_drf', viewset=modelviewset_view.Books, base_name='books')
print(router.urls)
urlpatterns +=router.urls

三、如果想要对自定义命名的方法,自动生成路由,这个时候使用@action装饰器

from rest_framework.viewsets import ModelViewSet
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializer
from rest_framework.response import Response
from rest_framework.decorators import action 

class Books(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

    # 定义如果超出那五个方法之外的方法,需要使用action装饰器
    @action(methods=['get'], detail=True)
    def lastdata(self, request, pk):
        book = BookInfo.objects.get(id=pk)
        ser = BookSerializer(book)
        return Response(ser.data)

?四、self.action

self.action,可以看出请求的是谁,根据不同的请求返回不同的序列化器。这种场景使用概率比较小

from rest_framework.viewsets import ModelViewSet
from testdjango.models import BookInfo
from book_drf.serializer import BookSerializer
from rest_framework.response import Response


class Books(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookSerializer

    # 根据这方法可以看出请求的是谁,返回哪个序列化器
    def get_serializer_class(self):
        if self.action == 'lastdata':
            return BookSerializer
        else:
            return BookSerializer

    # 定义如果超出那五个方法之外的方法,需要使用action装饰器
    @action(methods=['get'], detail=True)
    def lastdata(self, request, pk):
        # 使用self.action 获取请求的是哪个方法,可以根据请求的是哪个
        print(self.action)
        book = BookInfo.objects.get(id=pk)
        ser = self.get_serializer_class(book)
        return Response(ser.data)

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:27:16  更:2022-03-10 22:29:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:28:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码