今日学习内容
2 个视图基类
属性 | 说明 |
---|---|
queryset | 要序列化的数据 |
serializer | 序列化类 |
lookup_field(了解) | 通过get_object 获取单个对象的查询key值,value值是路由中传来的 |
filter_backends(了解) | 过滤类 |
pagination_class(了解) | 分页类 |
.
方法 | 说明 |
---|---|
get_queryset | 获取要序列化的数据 |
get_object | 根据lookup_field配置的参数获取单个对象 |
get_serializer | 获取序列化类 |
get_serializer_class | 获取序列化类,不是咱们直接用的get_serializer调用了它 |
filter_queryset(了解) | 跟过滤有关系 |
paginate_xxx(了解) | 跟分页有关 |
基于APIView写5个接口
class UserView(APIView):
def get(self, request):
res_list = User.objects.all()
ser = UserSerializer(instance=res_list, many=True)
return Response(ser.data)
def post(self, request):
ser = UserSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors})
class UserDetailView(APIView):
def get(self, request, pk):
obj = User.objects.filter(pk=pk).first()
ser = UserSerializer(instance=obj)
return Response(ser.data)
def put(self, request, pk):
obj = User.objects.filter(pk=pk).first()
ser = UserSerializer(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors})
def delete(self, request, pk):
User.objects.filter(pk=pk).delete()
return Response('')
基于GenericAPIView写5个接口
class UserView(GenericAPIView):
# 配置两个 类属性
queryset = User.objects.all()
serializer_class = UserSerializer
# def get_queryset(self):
# if self.request.method=='GET':
# return User.objects.all()
# else:
# return Publish.object.all()
def get(self, request):
res_list = self.get_queryset() # 提高扩展性
ser = self.get_serializer(instance=res_list, many=True)
return Response(ser.data)
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "新增成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors})
class UserDetailView(GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request, pk):
# obj = self.get_queryset().filter(pk=pk).first()
# queryset.get({'pk':'有名分组分出来的'}
obj = self.get_object() # 根据传入的pk,获取一条数据
ser = self.get_serializer(instance=obj)
return Response(ser.data)
def put(self, request, pk):
obj = self.get_object()
ser = self.get_serializer(instance=obj, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 100, 'msg': "修改成功"}, status=201)
else:
return Response({'code': 101, 'msg': ser.errors})
def delete(self, request, pk):
self.get_queryset().filter(pk=pk).delete()
return Response('')
5个视图扩展类
基于GenericAPIView+5个视图扩展类写接口
必须配合GenericAPIView使用,不能配合APIView使用
from rest_framework.mixins import RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, \
ListModelMixin
class UserView(GenericAPIView, ListModelMixin, CreateModelMixin):
# 配置两个 类属性
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
class UserDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
queryset = User.objects.all()
serializer_class = UserSerializer
def get(self,request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self, request, *args,**kwargs):
return self.update(request,*args,**kwargs)
def delete(self, request, *args,**kwargs):
return self.destroy(request,*args,**kwargs)
.
RetrieveModelMixin:写了一个Create方法,就是原来post中的代码
RetrieveModelMixin:retrieve,就是原来的get
UpdateModelMixin:update方法,就是原来的put
ListModelMixin:list方法,就是原来的get
DestroyModelMixin:destroy方法,就是原来咱们的delete
9个视图子类
基于9个视图子类写接口
视图类:继承GenericAPIView+某个或某几个视图扩展类
from rest_framework.generics import ListAPIView,CreateAPIView, RetrieveAPIView,DestroyAPIView,UpdateAPIView
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
# 正常来讲 Destroy+Update 应该有一个 ,作者没加
class UserView(ListCreateAPIView):
# 配置两个 类属性
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetailView(RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
视图集
继承ModelViewSet编写5个接口
视图类
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
class UserView(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
路由
path('user/', views.UserView.as_view({'get': 'list', 'post': 'create'})),
path('user/<int:pk>', views.UserView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
源码分析ViewSetMixin
@classonlymethod
def as_view(cls, actions=None, **initkwargs):
# 路由中as_view中必须传参数,必须传字典:{'get': 'list', 'post': 'create'}
if not actions:
raise TypeError("The `actions` argument must be provided when "
"calling `.as_view()` on a ViewSet. For example "
"`.as_view({'get': 'list'})`")
# 路由匹配成功,执行view(request),request是老的request
def view(request, *args, **kwargs):
# actions={'get': 'list', 'post': 'create'}
for method, action in actions.items():
# method:get action:list
# self 是视图类的对象中通过反射,查找list,
# handler视图类中的list方法
handler = getattr(self, action)
# 向视图类的对象中,反射 method:get,handler:list方法
# self.get=list
setattr(self, method, handler)
return self.dispatch(request, *args, **kwargs)
return csrf_exempt(view)
知识点大串讲
-
计算机基础之编程
- 计算机基础之编程
- 计算机组成原理
- 计算机操作系统
- 编程语言分类
-
Python解释器和集成环境
- 解释器:3.10
- pycharm,vscode
- 配置清华源:第三方模块,国外
-
Python基础
-
变量:id type value === str, int, float, set, dict, list, tuple
-
常量:全大写,没有特别的规定常量。
-
注释
-
数据类型基础:一切皆对象
- 数字类型
- 字符串类型 .endswith
- 列表类型:append, extends区别
- 字典类型
- 布尔类型
-
解压缩
-
Python与用户交互 input
-
故事化输出的三种方式
-
基本运算符:逻辑运算符, 算数运算符,成员运算符, 身份运算符
-
流程控制之if判断
-
流程控制之while循环
-
流程控制之for循环:for i in xx : Python 中只有基于迭代的循环,没有基于索引的循环
-
Python基础实战之猜年游戏
-
-
Python 进阶
- 异常处理:try except finally , Exception, 自定义异常
- 数字类型内置方法
- 字符串类型内置方法
- 列表类型内置方法
- 元组类型内置方法
- 字典类型内置方法
- 集合类型内置方法
- 数据类型分类:可变不可变
- Python深浅拷贝(面试: copy,deepcopy)
-
文件处理
- 字符编码:asiia,gbk,unicode,utf-8
- 基本的文件操作:open
- 绝对路径和相对路径
- 文件的三种打开模式:r,w,a
- with管理文件操作上下文
- 文件的高级应用:rt,rb ,如果是以t方式打开,一定要指定编码
- 文件修改的两种方式
- 文件处理小结
- 文件处理实战之购物车系统
-
函数基础
- 函数的定义
- 定义函数的形式
- 函数的返回值
- 函数的调用
- 函数的参数:实参,形参
- 可变长参数:*args,**kwargs,默认参数
- 函数对象
- 函数嵌套:定义:函数内定义函数 调用:函数内调用函数
- 名称空间和作用域:LEGB
- 函数基础小结
- 函数基础实战之ATM和购物车系统
-
函数进阶
- 闭包函数:1 定义在函数内部 2 对外部作用域有引用
- 装饰器: 是闭包的典型应用
- 迭代器:
- 生成器: 函数中有 yield 关键字
- 三元表达式:优雅的替换掉if判断
- 列表推导式[]
- 字典生成式{}
- 生成器生成式()
- 递归:递归调用,结束条件,最大递归深度
- 匿名函数
- 内置函数 type,intpu,map
-
模块和包基础
- 模块的四种形式
- import和from…import
- 循环导入问题
- 对导入和绝对导入
- 模块的搜索路径
- Python文件的两种用途:一个当模块给别人导,一个是当脚本运行
- 包 init
- 软件开发目录规范
- 模块基础小结
- 模块基础实战之ATM和购物车系统分文件处理
-
内置模块
- -time模块
- -datetime模块
- -random模块
- -os模块
- -sys模块
- -json和pickle模块
- -hashlib和hmac模块
- -re模块:正则
- -collections模块
- -pathlib模块(了解)
- -xml模块(了解)
- -subprocess模块(了解)
-
面向对象基础
- -面向对象的由来
- -面向对象编程介绍
- -类与对象
- -定制对象独有特征:对象属性 dict
- -对象属性查找顺序:先找对象,再找类
- -对象的绑定方法
- -类和数据类型:类即类型
- -对象的高度整合:属性和方法放到一个类里---》对象
- -面向对象基础实战之英雄联盟
- -继承封装多态
- -类的继承:多继承---》查找顺序
- -类的派生:派生类,子类
- -类的组合
- -菱形继承问题
- -super()方法详解
- -类的多态和多态性
- -类的封装:__隐藏属性或方法
- -类的property特性
- -类和对象的绑定方法及非绑定方法
- -面向对象进阶实战之选课系统
-
面向对象高级
isinstance和issubclass 反射(hasattr和getattr和setattr和delattr) ---------------------------------------------- __setattr__和__delattr__和__getattr__ -__setitem__和__getitem和__delitem__ -__format__ -__del__ __slots__ __doc__ __call__ -__init__和__new__ __str__和__repr__ -实现迭代器(__next__和__iter__) -__module__和__class__ -实现文件上下文管理(__enter__和__exit__) -元类(metaclass)
-
网络编程(了解)
- -网络架构及其演变过程
- -互联网和互联网的组成
- -OSI七层协议
- -TCP协议的三次握手和四次挥手
- -基于TCP协议的socket套接字编程
- -Socket抽象层
- -模拟ssh远程执行命令
- -粘包问题
- -解决粘包问题
- -基于UDP协议的socket套接字编程
- -基于socketserver实现并发的socket套接字编程
-
并发编程(了解)
- 操作系统的发展史
- 进程基础
- 进程调度
- 进程的并行和并发
- 同步异步阻塞非阻塞
- 进程的创建和结束
- 开启多进程(multiprocess.process)
- 进程同步(multiprocess.Lock)
- 进程间通信(multiprocess.Queue)
- 进程间数据共享(multiprocess.Manager)
线程基础 进程和线程的区别 使用线程的场景 内存中的线程 GIL全局解释器锁 创建多线程 守护线程 锁-信号量-Event事件 线程队列 concurrent模块 协程基础 协程之greenlet模块 协程之gevent模块 IO模型:面试重点 并发编程小结 并发下的socket套接字编程
-
数据库基础(重点)
- -初识MySQL
- -Windows安装MySQL
- -Linux安装MySQL
- -Mac安装MySQL
- 6-MySQL存储引擎概述
- -MySQL库操作-表操作
- -MySQL支持的数据类型
- -MySQL表的完整性约束
- -MySQL记录操作
- -MySQL单表查询
- -MySQL多表查询
- -MySQL多表查询综合练习答案
- -MySQL索引原理
- -MySQL索引的数据结构-B+树介绍
- -MySQL性能分析之Explain
- -使用Python操作MySQL数据库
-
前端
- -HTML5基础
- -HTML5常用标签
- -CSS基础
- -CSS3选择器
- -CSS3基础样式
- -CSS3基础布局
- JavaScript基础
- JavaScript基本数据类型
- JavaScript函数
- JS的BOM操作
- JS的DOM操作
- JQuery基础
- JQuery选择器
- JQuery文本属性样式操作
- JQuery操作DOM
- JQuery动画效果
- JQuery插件
- BootStrap基础
- BootStrap布局
- BootStrap组件
- BootStrap插件
-
Django入门(重点)
-
Web应用
-
Http协议
-
Web框架:django,flask,sanic,fastapi。。。。。
-
Django简介
-
-
Django进阶(重点)
- 路由层:
- -路由控制
- 视图层:
- -视图层
- 模板层:
- -模板层
- 模型层:
- -单表操作 –|| –
- -多表操作 –|| –
- -其他用字段和参数 –|| –
- -模型层进阶
- 路由层:
-
Django高级
- -Django与Ajax
- 13-Django高级之-分页器
- 14-Django高级之-forms组件
- 15-Django高级之-cookie与session
- 16-Django高级之-中间件
- 17-Django高级之-Auth
作业
视图中所有类:继承关系画出来,有哪些常用属性或方法写出来
标签:__,return,ser,get,python,self,request,学习,Day67 From: https://www.cnblogs.com/bjyxxc/p/16748947.html