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. Linux终端下简单的登录程序 密码不回显

    在Linux进行登录是输入密码不会被回显,所以我也写了个简单的登入程序,使得在输入密码时不再进行回显. #include <stdio.h> #include <stdlib.h&g ...

  2. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  3. 用Emacs编写mybatis

    用Emacs编写mybatis */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} ...

  4. RDD缓存

    RDD的缓存 Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或缓存数据集.当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,并在对此RDD或衍生出的RDD进行的其他 ...

  5. Mata标签,og标签

    一.Mata标签 meta是用来在HTML文档中模拟HTTP协议的响应头报文,meta 标签用于网页的<head>与</head>中.meta 的属性有两种:name和http ...

  6. Sass-@for

    在制作网格系统的时候,大家应该对 .col1~.col12 这样的印象较深.在 CSS 中你需要一个一个去书写,但在 Sass 中,可以使用 @for 循环来完成.在 Sass 的 @for 循环中有 ...

  7. axis2获取request方法

    修改axis2的请求url-pattern 找到axis2-kernel jar包中axis2.xml配置文件的servicePath配置项,修改成与url-pattern一样的值,这样就改变了请求的 ...

  8. html5 固定边栏滚动特效

    <script src="https://code.jquery.com/jquery.js"></script> //引入jquery <scrip ...

  9. ElasticSearch 单台服务器部署多个节点

    转载:https://www.cnblogs.com/wxw16/p/6160186.html 一般情况下单台服务器只会部署一个ElasticSearch node,但是在学习过程中,很多情况下会需要 ...

  10. 【python实例】统计字符串里大写字母,小写字母的个数和非字母的个数

    """ 给定一个以下字符串:统计大写字母的个数,小写字母的个数,非字母的个数. str1 = "ajdkkKDKEK1343KFKiriromfkfKKRIOW ...