1.基础

  1. restful规范:
  2. - url:一般用名词 http://www.baidu.com/article (面向资源编程)
  3. - 根据请求方式的不同做不同操作:get,post,put,delete,patch
  4. - 一般传输的数据格式都是json
  5. - 根据筛选条件可以在url后面添加参数 http://www.baidu.com/article?page=1
  6. 一些动态变化的使用fk,不会动态变化的直接加入到内存里面,查找速度比较快。
  7. 分表:水平分表,垂直分表
  8. serraliserz想自己添加参数的话 save里面自己添加数据
  9. onetoone的反向查找表明小写1.数据库设计
  10. 1.对于没有变化的数据要放在内存里面直接读进去,不需要连表。因为以后在跨表查询的时候会降低数据库性能。
  11. 不会动态变化的要设计成fk形式
  12. 2.将数据量大的表和不常用的数据字段进行拆分
  13. 3.分表:如果表中列太多/内容量大可以选择水平分表
  14. 4.表的自关联
  15.  
  16. 2.系统架构
  17. 这是比较简单的cms(内容发布系统),一般系统架构如下
  18. 前端:使用ajax从接口获取数据,进行渲染
  19. 后端:进行新闻等采集添加
  20. 接口:提供数据给前端展示
  21. 数据库:存放数据内容
  22.  
  23. 用户浏览器访问,在vue上那会前端页面,返回给浏览器一大堆html页面,用户浏览器触发ajax
  24. api接口取出数据,返回到浏览器进行渲染

 2.筛选器(自己处理的筛选)

  1. 自己处理的筛选
  2. # 筛选按分类的新闻
  3. #访问方式
  4. 全部:http://127.0.0.1:8000/hg/article/
  5. 筛选:http://127.0.0.1:8000/hg/article/?category=2
  6. #视图函数
  7. class ArticleView(APIView):
  8. """ 文章视图类 """
  9.  
  10. def get(self,request,*args,**kwargs):
  11. """ 获取文章列表 """
  12. pk = kwargs.get('pk')
  13. if not pk:
  14. condition = {}
  15. category = request.query_params.get('category')
  16. if category:
  17. condition['category'] = category
  18. queryset = models.Article.objects.filter(**condition).order_by('-date')
  19.  
  20. pager = PageNumberPagination()
  21. result = pager.paginate_queryset(queryset,request,self)
  22. ser = ArticleListSerializer(instance=result,many=True)
  23. return Response(ser.data)
  24. article_object = models.Article.objects.filter(id=pk).first()
  25. ser = PageArticleSerializer(instance=article_object,many=False)
  26. return Response(ser.data)

drf提供的筛选功能

  1. drf组件内置筛选功能
  2. 通过drf内置组件完成筛选功能
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5. from . import models
  6. from rest_framework.filters import BaseFilterBackend
  7.  
  8. # BaseFilterBackend是drf给我们提供筛选的方法,是个约束类,必须实现filter_queryset方法
  9. class MyFilterBackend(BaseFilterBackend):
  10. def filter_queryset(self, request, queryset, view):
  11. # 试下筛选的过程
  12. val = request.query_params.get('category')
  13. return queryset.filter(category_id=val)
  14. class IndexView(APIView):
  15. # 是个约束类,必须实现filter_queryset方法
  16. def get(self,request,*args,**kwargs):
  17. queryset = models.News.objects.all()
  18. obj = MyFilterBackend()
  19. result = obj.filter_queryset(request,queryset,self)
  20. print(result)
  21. return Response('index')

3.drf源码分析(筛选,序列化,分页的等)

  1. apiview其实什么功能都没有给我们提供什么功能,都是我们自己去写的
  2. drf实现分页
  3. from rest_framework.generics import GenericAPIView
  4. from rest_framework.filters import BaseFilterBackend
  5. from rest_framework import serializers
  6. from rest_framework.pagination import PageNumberPagination
  7.  
  8. # 筛选
  9. class NewsFilterBackend(BaseFilterBackend):
  10. def filter_queryset(self, request, queryset, view):
  11. # 试下筛选的过程
  12. val = request.query_params.get('category')
  13. return queryset.filter(category=val)
  14. # 序列化
  15. class NewsSerializer(serializers.ModelSerializer):
  16. class Meta:
  17. model = models.News
  18. fields = "__all__"
  19.  
  20. class NewsView(GenericAPIView):
  21. # GenericAPIView继承的时APIview,APIview继承的时django的view
  22. queryset = models.News.objects.all() # 获取全部数据
  23. filter_backends = [NewsFilterBackend,] # 过滤
  24. serializer_class = NewsSerializer # 序列化
  25. pagination_class = PageNumberPagination # 分页
  26. def get(self,request,*args,**kwargs):
  27. v = self.get_queryset()
  28. # queryset = self.filter_queryset(self.queryset)
  29. queryset = self.filter_queryset(v)
  30. """
  31. 总结:# queryset = self.filter_queryset(self.queryset)
  32. self.queryset等于的是models.News.objects.all()
  33. 由于我们自己没有filter_queryset,所以去父类里面寻找filter_queryset
  34. 在父类的filter_queryset,有一个self.filter_backends参数。
  35. 如果我们自己有self.filter_backends,就是用我们自己的如果没有就使用配置文件里面的 filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
  36. 由于我们自己的filter_backends = [NewsFilterBackend,]是一个列表,NewsFilterBackend是一个类名。
  37. 所以父类方法queryset = backend().filter_queryset(self.request, queryset, self)中的额backend()等于我们的类名
  38. 并且实例化去执行filter_queryset()方法,由于我们自己有filter_queryset方法。所以执行我们自己的filter_queryset方法,也就是筛选方法
  39. 所以queryset = self.filter_queryset(self.queryset)的返回值是我们自己的filter_queryset的返回值
  40.  
  41. 所以同理v = queryset = models.News.objects.all()
  42. """
  43. # 分页功能
  44. data = self.paginate_queryset(queryset)
  45. """
  46. 执行父类的paginate_queryset,父类里面调用paginator方法
  47. paginator方法使用pagination_class参数并实力化,所以我们可以自己设定一个pagination_class,并指定分页要使用的分页
  48.  
  49. """
  50. # 以前的序列化方法
  51. # ser = NewsSerializer(instance=queryset,many=True)
  52. ser = self.get_serializer(instance=data,many=True)
  53. return Response(ser.data)
  54. """
  55. 总结:
  56. get_serializer在自己的类里面找,没有使用父类的get_serializer,
  57. 父类里面self.get_serializer_class()也会先在自己的类里面找self.get_serializer_class()方法
  58. 没有的话在执行父类的self.get_serializer_class(),父类的self.get_serializer_class()方法返回了serializer_class
  59. 先在自己的类里面找,如果没有就返回None
  60. 所以我们在自己的类里面定义一个serializer_class表示要是用的序列化的类
  61. 所以self.get_serializer等于我们自己定义序列化的类,并且会实力化并返回return serializer_class(*args, **kwargs)
  62. 所以self.get_serializer做的就是帮助我们实力化我们自己的序列化的类
  63.  
  64. 所以访问方式为:http://127.0.0.1:8888/shuixuan/news/?category=1&page=2
  65. category代表分类方式,page代表分页
  66. """

 4.drf视图(day82视图关系)

  1. APIView,感觉没提供功能。
  2. GenericAPIView,桥梁,内部定义:get_queryset/get_serilizer/get_page...
  3. ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
  4.  
  5. class TagSer(serializers.ModelSerializer):
  6.   class Meta:
  7.     model = models.Tag
  8.     fields = "__all__"
  9.  
  10. class TagView(ListAPIView,CreateAPIView):
  11.   queryset = models.Tag.objects.all()
  12.   serializer_class = TagSer
  13.  
  14.   def get_serializer_class(self):
  15.   # self.request
  16.   # self.args
  17.   # self.kwargs
  18.     if self.request.method == 'GET':
  19.       return TagSer
  20.     elif self.request.method == 'POST':
  21.     return OtherTagSer
  22.   def perform_create(self,serializer):
  23.     serializer.save(author=1)
  24.  
  25. class TagDetailView(RetrieveAPIView,UpdateAPIView,DestroyAPIView):
  26.   queryset = models.Tag.objects.all()
  27.   serializer_class = TagSer

 5.继承过那些视图函数,有什么区别?

  1. APIView,感觉没提供功能。
  2. GenericAPIView,桥梁,内部定义:get_queryset/get_serilizer/get_page...
  3. ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView
    ListAPIcieMixin。。。。等还有一种类
  4.  
  5. 区别:
      首先继承过三大类。
        apiview:在期内部知识提供了基础功能,权限,认证,节流等,但是增删改查,得我们自己写
        ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestroyAPIView:我们可以写一些筛选器的类,分页器的类,就可以实现功能。
  1.  

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. 利用多态,简易实现电脑usb连接设备案例

    package cn.learn.Practice03; public interface UsbInterface { void open(); //打开usb void close(); //关闭 ...

  2. JavaScript实现的发布/订阅(Pub/Sub)模式

    JavaScript实现的发布/订阅(Pub/Sub)模式 时间 2016-05-02 18:47:58  GiantMing's blog 原文  http://giantming.net/java ...

  3. 厉害了,Google大神每天写多少行代码?

    文章转自开源中国社区,编译自:Quora Quora上有个有趣的问题:Google工程师们每天写多少行代码? Google 的 AdMob 全栈工程师 Raymond Farias 在 Quora 发 ...

  4. 查找idt table 所對應的page table in Linux

    #include <linux/kernel.h> #include <linux/module.h> #include <linux/types.h> #incl ...

  5. 牛客练习赛27-----C.水图(DFS求最长路径)

    传送门 来源:牛客网题目描述:小w不会离散数学,所以她van的图论游戏是送分的小w有一张n个点n-1条边的无向联通图,每个点编号为1~n,每条边都有一个长度小w现在在点x上她想知道从点x出发经过每个点 ...

  6. eclipsePreferences位置

    1.Windows:菜单栏-Window-Preferences 2.Mac:应用顶部最左侧Eclipse-Preferences ---------------------------------- ...

  7. jenkinsapi和python打包工具的安装日志

    Successfully installed PyInstaller-3.3.1 altgraph-0.15 dis3-0.1.2 future-0.16.0 macholib-1.9 pefile- ...

  8. UI库colorui的使用————小程序

    UI库colorui的使用----小程序 把colorui文件放到你的小程序中 包含文件: icon.wxss+main.wxss+components(文件夹里有icon和一些组件)+animati ...

  9. R语言ggplot2软件包

    相比r语言自带软件包,ggplot2有以下特色 图形语法的核心:统计图形是数据向几何对象属性的一个映射.

  10. rabbitmq路由规则

    信道如何共用???? 几台机器共用一个channel 如何做到?