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 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- POJ 1438 One-way Traffic (混合图+边双连通)
<题目链接> 题目大意: 给定一个混合图,问你在能够使得图中所有点能够两两到达的情况下,尽可能多的将无向边变成有向边,输出这些无向边的变化方案. 解题分析:这与之前做过的这道题非常类似 P ...
- UVALive 6270 Edge Case(找规律,大数相加)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/36905379 转载请注明出 ...
- C# json格式的序列化与反序列化
使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象 Json[javascript对象表示方法],它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易 ...
- C#中XmlTextWriter读写xml文件详细介绍
XmlTextWriter类允许你将XML写到一个文件中去.这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML.为了使用这个类,你必须首先创建一个新的XmlTextWriter对 ...
- Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)
在异步请求中要返回文件流,不能使用JQuery,因为$.ajax,$.post 不支持返回二进制文件流的类型,可以看到下图,dataType只支持xml,json,script,html这几种格式,没 ...
- [置顶]unity常用开发套件
维京人骨骼动画制作(Unity 2D Animation资源包使用指南) 维京人骨骼动画制作2(Unity 2D IK资源包使用指南) -------------------------------- ...
- 【记录】mysql查询语句对于为null和为空字符串给出特定值处理
SELECT if(IFNULL(filedName,"指定字符串")="","指定字符串",filedName) '重命名的字符名' FR ...
- linux性能分析工具Cpu
- POJ 3237 树链剖分
题目链接:http://poj.org/problem?id=3237 题意:给定一棵n个结点n-1条边的树. 每条边都是一个边权. 现在有4种操作 1:CHANGE I V:把(输入的)第i条边的边 ...