drf:筛选,序列化
1.基础
restful规范:
- url:一般用名词 http://www.baidu.com/article (面向资源编程)
- 根据请求方式的不同做不同操作:get,post,put,delete,patch
- 一般传输的数据格式都是json
- 根据筛选条件可以在url后面添加参数 http://www.baidu.com/article?page=1 一些动态变化的使用fk,不会动态变化的直接加入到内存里面,查找速度比较快。 分表:水平分表,垂直分表 serraliserz想自己添加参数的话 在save里面自己添加数据 onetoone的反向查找表明小写1.数据库设计
1.对于没有变化的数据要放在内存里面直接读进去,不需要连表。因为以后在跨表查询的时候会降低数据库性能。
不会动态变化的要设计成fk形式
2.将数据量大的表和不常用的数据字段进行拆分
3.分表:如果表中列太多/内容量大可以选择水平分表
4.表的自关联 2.系统架构
这是比较简单的cms(内容发布系统),一般系统架构如下
前端:使用ajax从接口获取数据,进行渲染
后端:进行新闻等采集添加
接口:提供数据给前端展示
数据库:存放数据内容 用户浏览器访问,在vue上那会前端页面,返回给浏览器一大堆html页面,用户浏览器触发ajax
在api接口取出数据,返回到浏览器进行渲染
2.筛选器(自己处理的筛选)
自己处理的筛选
# 筛选按分类的新闻
#访问方式
全部:http://127.0.0.1:8000/hg/article/
筛选:http://127.0.0.1:8000/hg/article/?category=2
#视图函数
class ArticleView(APIView):
""" 文章视图类 """ def get(self,request,*args,**kwargs):
""" 获取文章列表 """
pk = kwargs.get('pk')
if not pk:
condition = {}
category = request.query_params.get('category')
if category:
condition['category'] = category
queryset = models.Article.objects.filter(**condition).order_by('-date') pager = PageNumberPagination()
result = pager.paginate_queryset(queryset,request,self)
ser = ArticleListSerializer(instance=result,many=True)
return Response(ser.data)
article_object = models.Article.objects.filter(id=pk).first()
ser = PageArticleSerializer(instance=article_object,many=False)
return Response(ser.data)
drf提供的筛选功能
drf组件内置筛选功能
通过drf内置组件完成筛选功能
from rest_framework.views import APIView
from rest_framework.response import Response
from . import models
from rest_framework.filters import BaseFilterBackend # BaseFilterBackend是drf给我们提供筛选的方法,是个约束类,必须实现filter_queryset方法
class MyFilterBackend(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 试下筛选的过程
val = request.query_params.get('category')
return queryset.filter(category_id=val)
class IndexView(APIView):
# 是个约束类,必须实现filter_queryset方法
def get(self,request,*args,**kwargs):
queryset = models.News.objects.all()
obj = MyFilterBackend()
result = obj.filter_queryset(request,queryset,self)
print(result)
return Response('index')
3.drf源码分析(筛选,序列化,分页的等)
apiview其实什么功能都没有给我们提供什么功能,都是我们自己去写的
drf实现分页
from rest_framework.generics import GenericAPIView
from rest_framework.filters import BaseFilterBackend
from rest_framework import serializers
from rest_framework.pagination import PageNumberPagination # 筛选
class NewsFilterBackend(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 试下筛选的过程
val = request.query_params.get('category')
return queryset.filter(category=val)
# 序列化
class NewsSerializer(serializers.ModelSerializer):
class Meta:
model = models.News
fields = "__all__" class NewsView(GenericAPIView):
# GenericAPIView继承的时APIview,APIview继承的时django的view
queryset = models.News.objects.all() # 获取全部数据
filter_backends = [NewsFilterBackend,] # 过滤
serializer_class = NewsSerializer # 序列化
pagination_class = PageNumberPagination # 分页
def get(self,request,*args,**kwargs):
v = self.get_queryset()
# queryset = self.filter_queryset(self.queryset)
queryset = self.filter_queryset(v)
"""
总结:# queryset = self.filter_queryset(self.queryset)
self.queryset等于的是models.News.objects.all()
由于我们自己没有filter_queryset,所以去父类里面寻找filter_queryset
在父类的filter_queryset,有一个self.filter_backends参数。
如果我们自己有self.filter_backends,就是用我们自己的如果没有就使用配置文件里面的 filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
由于我们自己的filter_backends = [NewsFilterBackend,]是一个列表,NewsFilterBackend是一个类名。
所以父类方法queryset = backend().filter_queryset(self.request, queryset, self)中的额backend()等于我们的类名
并且实例化去执行filter_queryset()方法,由于我们自己有filter_queryset方法。所以执行我们自己的filter_queryset方法,也就是筛选方法
所以queryset = self.filter_queryset(self.queryset)的返回值是我们自己的filter_queryset的返回值 所以同理v = queryset = models.News.objects.all()
"""
# 分页功能
data = self.paginate_queryset(queryset)
"""
执行父类的paginate_queryset,父类里面调用paginator方法
paginator方法使用pagination_class参数并实力化,所以我们可以自己设定一个pagination_class,并指定分页要使用的分页 """
# 以前的序列化方法
# ser = NewsSerializer(instance=queryset,many=True)
ser = self.get_serializer(instance=data,many=True)
return Response(ser.data)
"""
总结:
get_serializer在自己的类里面找,没有使用父类的get_serializer,
父类里面self.get_serializer_class()也会先在自己的类里面找self.get_serializer_class()方法
没有的话在执行父类的self.get_serializer_class(),父类的self.get_serializer_class()方法返回了serializer_class
先在自己的类里面找,如果没有就返回None
所以我们在自己的类里面定义一个serializer_class表示要是用的序列化的类
所以self.get_serializer等于我们自己定义序列化的类,并且会实力化并返回return serializer_class(*args, **kwargs)
所以self.get_serializer做的就是帮助我们实力化我们自己的序列化的类 所以访问方式为:http://127.0.0.1:8888/shuixuan/news/?category=1&page=2
category代表分类方式,page代表分页
"""
4.drf视图(day82视图关系)
APIView,感觉没提供功能。
GenericAPIView,桥梁,内部定义:get_queryset/get_serilizer/get_page...
ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView class TagSer(serializers.ModelSerializer):
class Meta:
model = models.Tag
fields = "__all__" class TagView(ListAPIView,CreateAPIView):
queryset = models.Tag.objects.all()
serializer_class = TagSer def get_serializer_class(self):
# self.request
# self.args
# self.kwargs
if self.request.method == 'GET':
return TagSer
elif self.request.method == 'POST':
return OtherTagSer
def perform_create(self,serializer):
serializer.save(author=1) class TagDetailView(RetrieveAPIView,UpdateAPIView,DestroyAPIView):
queryset = models.Tag.objects.all()
serializer_class = TagSer
5.继承过那些视图函数,有什么区别?
APIView,感觉没提供功能。
GenericAPIView,桥梁,内部定义:get_queryset/get_serilizer/get_page...
ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
ListAPIcieMixin。。。。等还有一种类 区别:
首先继承过三大类。
apiview:在期内部知识提供了基础功能,权限,认证,节流等,但是增删改查,得我们自己写
ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView:我们可以写一些筛选器的类,分页器的类,就可以实现功能。
pass
drf:筛选,序列化的更多相关文章
- drf框架序列化和返序列化
0903自我总结 drf框架序列化和反序列化 from rest_framework import serializers 一.自己对于序列化和反序列化使用的分类 前后端交互主要有get,post,p ...
- Django框架深入了解_02(DRF之序列化、反序列化)
序列化:将Python对象准换成json格式的字符串,反之即为反序列化 DRF的序列化使用过程: 使用drf的序列化组件 -1 新建一个序列化类继承Serializer -2 在类中写要序列化的字段 ...
- drf框架 - 序列化组件 | Serializer
序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...
- Django drf:序列化增删改查、局部与全局钩子源码流程、认证源码分析、执行流程
一.序列化类的增.删.改.查 用drf的序列化组件 -定义一个类继承class BookSerializer(serializers.Serializer): -写字段,如果不指定source ...
- 第三章、drf框架 - 序列化组件 | Serializer
目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...
- DRF的序列化组件
目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...
- drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)
ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...
- DRF如何序列化外键的字段
我觉得在有些应用场景下,这个操作是有用的,因为可以减少一个AJAX的请求,以增加性能. 当然,是二次请求,还是一次传输.这即要考虑用户体验,还要兼顾服务器性能. 一切是有条件的平衡吧.就算是一次传输, ...
- DRF中序列化器定义及使用
首先需要明白序列化和反序列化的定义及作用: 序列化是将程序语言转换为JSON/XML; 反序列化是将JSON/XML转换为程序语言; 对应到Django中,序列化即把模型对象转换为字典形式, 在返回给 ...
随机推荐
- Codeforces 1156E Special Segments of Permutation(单调栈)
可以用单调栈直接维护出ai所能覆盖到的最大的左右范围是什么,然后我们可以用这个范围暴力的去查询这个区间的是否有满足的点对,一个小坑点,要对左右区间的大小进行判断,只需要去枚举距离i最近的一段区间去枚举 ...
- 源码分析--ConcurrentHashMap与HashTable(JDK1.8)
ConcurrentHashMap和Hashtable都是线程安全的K-V型容器.本篇从源码入手,简要说明它们两者的实现原理和区别. 与HashMap类似,ConcurrentHashMap底层也是以 ...
- 使用join和CountDownLatch来等待线程结束
1.join方法的实现 join只能在start()之后调用, join 某个线程A,会使当前线程B进入等待,直到线程A结束生命周期(isAlive()==false) ,或者达到给定的时间. 在此期 ...
- python进行两个大数相加
python进行两个大数相加:由于int类型32位或64位都有长度限制,超出会内存溢出,无法计算,那么解决方法如下: 思路: 1.将超长数转换成字符串 2.进行长度补零,即让两个要计算的字符串长度一样 ...
- Sass--传一个不带值的参数
Sass 的混合宏有一个强大的功能,可以传参,那么在 Sass 中传参主要有以下几种情形: A) 传一个不带值的参数 在混合宏中,可以传一个不带任何值的参数,比如: @mixin border-rad ...
- [BZOJ5407]girls
也是CF985G... 容斥+三元环计数 CF数据太弱啦 vis没赋初值-1竟然过了QAQ 所以又调了我半个小时才搞掉QAQ 数数真难QAQ 记得要写#include<vector>!!! ...
- BZOJ2695 保护古迹
非常带劲之计算几何 写的头晕= = 就是平面图转对偶图然后最小割 由于p非常小我们枚举所有保护状态然后割一下 建图真的烦 就是把区域划分出来看一下每一个古迹点是否被小区域包含[好像也可以写点定位] 然 ...
- C#基础提升系列——C# LINQ
C# LINQ LINQ(Language Integrated Query,语言集成查询).在C# 语言中集成了查询语法,可以用相同的语法访问不同的数据源. 命名空间System.Linq下的类En ...
- JavaWeb(二):Servlet
一.本教程使用的Web容器——Tomcat Tomcat是提供一个支持Servlet和JSP运行的容器.Servlet和JSP能根据实时需要,产生动态网页内容.而对于Web服务器来说, Apache仅 ...
- 谷歌使用navigator.mediaDevices.getUserMedia 调用摄像头拍照功能,不兼容IE
<template> <div> <!--canvas截取流--> <canvas ref="canvas" ...