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中,序列化即把模型对象转换为字典形式, 在返回给 ...
随机推荐
- 利用多态,简易实现电脑usb连接设备案例
package cn.learn.Practice03; public interface UsbInterface { void open(); //打开usb void close(); //关闭 ...
- JavaScript实现的发布/订阅(Pub/Sub)模式
JavaScript实现的发布/订阅(Pub/Sub)模式 时间 2016-05-02 18:47:58 GiantMing's blog 原文 http://giantming.net/java ...
- 厉害了,Google大神每天写多少行代码?
文章转自开源中国社区,编译自:Quora Quora上有个有趣的问题:Google工程师们每天写多少行代码? Google 的 AdMob 全栈工程师 Raymond Farias 在 Quora 发 ...
- 查找idt table 所對應的page table in Linux
#include <linux/kernel.h> #include <linux/module.h> #include <linux/types.h> #incl ...
- 牛客练习赛27-----C.水图(DFS求最长路径)
传送门 来源:牛客网题目描述:小w不会离散数学,所以她van的图论游戏是送分的小w有一张n个点n-1条边的无向联通图,每个点编号为1~n,每条边都有一个长度小w现在在点x上她想知道从点x出发经过每个点 ...
- eclipsePreferences位置
1.Windows:菜单栏-Window-Preferences 2.Mac:应用顶部最左侧Eclipse-Preferences ---------------------------------- ...
- jenkinsapi和python打包工具的安装日志
Successfully installed PyInstaller-3.3.1 altgraph-0.15 dis3-0.1.2 future-0.16.0 macholib-1.9 pefile- ...
- UI库colorui的使用————小程序
UI库colorui的使用----小程序 把colorui文件放到你的小程序中 包含文件: icon.wxss+main.wxss+components(文件夹里有icon和一些组件)+animati ...
- R语言ggplot2软件包
相比r语言自带软件包,ggplot2有以下特色 图形语法的核心:统计图形是数据向几何对象属性的一个映射.
- rabbitmq路由规则
信道如何共用???? 几台机器共用一个channel 如何做到?