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:筛选,序列化的更多相关文章

  1. drf框架序列化和返序列化

    0903自我总结 drf框架序列化和反序列化 from rest_framework import serializers 一.自己对于序列化和反序列化使用的分类 前后端交互主要有get,post,p ...

  2. Django框架深入了解_02(DRF之序列化、反序列化)

    序列化:将Python对象准换成json格式的字符串,反之即为反序列化 DRF的序列化使用过程: 使用drf的序列化组件 -1 新建一个序列化类继承Serializer -2 在类中写要序列化的字段 ...

  3. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  4. Django drf:序列化增删改查、局部与全局钩子源码流程、认证源码分析、执行流程

    一.序列化类的增.删.改.查 用drf的序列化组件   -定义一个类继承class BookSerializer(serializers.Serializer):   -写字段,如果不指定source ...

  5. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  6. DRF的序列化组件

    目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...

  7. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  8. DRF如何序列化外键的字段

    我觉得在有些应用场景下,这个操作是有用的,因为可以减少一个AJAX的请求,以增加性能. 当然,是二次请求,还是一次传输.这即要考虑用户体验,还要兼顾服务器性能. 一切是有条件的平衡吧.就算是一次传输, ...

  9. DRF中序列化器定义及使用

    首先需要明白序列化和反序列化的定义及作用: 序列化是将程序语言转换为JSON/XML; 反序列化是将JSON/XML转换为程序语言; 对应到Django中,序列化即把模型对象转换为字典形式, 在返回给 ...

随机推荐

  1. bfs(双向bfs加三维数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=2612 Find a way Time Limit: 3000/1000 MS (Java/Others)     ...

  2. Codeforces 1091C (数学)

    题面 传送门 分析 假设k是固定的,那访问到的节点编号就是\(1+(a·k \mod n )\),其中a为正整数. 通过找规律不难发现会出现循环. 通过题目中的图片我们不难发现 只有k=1,2,3,6 ...

  3. Codeforces - 1176E - Cover it! - bfs

    https://codeforc.es/contest/1176/problem/E 久了不写bfs了.一开始用dfs写,的确用dfs是很有问题的,一些奇怪的情况就会导致多染一些色. 注意无向图的边要 ...

  4. ArrayList与List<T>的区别

    ArrayList alist = new ArrayList(); //ArrayList(object value),所以ArrayList可以存储任何类型,如果存储值类型的话会进行装箱操作,在操 ...

  5. 一、WebApi模型验证

    一.新建项目 选择空的项目webapi 查看启动端口 创建控制器 添加方法 public class VerifController : ApiController { public IHttpAct ...

  6. OkHttp源码剥离导入到eclipse中

    1.里面有两个类关于Android版本的我稍微修改过了,没有用的. 2.可以直接导入eclipse中,maven里面的jar包可能还有不需要的冗余,可以自己去剔除. https://github.co ...

  7. Sass:RGB颜色函数-Mix()函数

    Mix 函数是将两种颜色根据一定的比例混合在一起,生成另一种颜色.其使用语法如下: mix($color-1,$color-2,$weight); $color-1 和 $color-2 指的是你需要 ...

  8. LeetCode(力扣)——Search in Rotated Sorted Array2 搜索旋转排序数组 python实现

    题目描述: python实现 Search in Rotated Sorted Array2 搜索旋转排序数组   中文: 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0 ...

  9. python 中的eval()函数,称为评估函数

    目的:使用BDD的时候,feture中传过来的预期结果是列表字符串:assert_list  =  "[1,2,3]",我想要的是[1,2,3] 处理方法:使用eval()评估函数 ...

  10. Linux中的uniq命令(去掉重复项,输出重复项)

    ls /bin /usr/bin | sort | uniq | less 上面这条命令的实际效果是: 获得 ls /bin /usr/bin 的 output 将上述 output 进行 sort ...