drf分页功能
什么是restful规范
是一套规则,用于程序之间进行数据交换的约定。
他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1
个接口,根据method的不同做不同的操作,比如:get/post/delete/put/patch/delete.
初次之外,resetful规范还规定了:
- 数据传输通过json
扩展:前后端分离、app开发、程序之间(与编程语言无关)
JSON:
{
name:'alex',
age:18,
gender:'男'
}
以前用webservice,数据传输格式xml。
XML
<name>alex</name>
<age>alex</age>
<gender>男</gender>什么是drf?
drf是一个基于django开发的组件,本质是一个django的app。
drf可以办我们快速开发出一个遵循restful规范的程序。drf如何帮助我们快速开发的?drf提供了那些功能?
- 视图,APIView用处还不知道。
- 解析器,根据用户请求体格式不同进行数据解析,解析之后放在request.data中。
在进行解析时候,drf会读取http请求头 content-type.
如果content-type:x-www-urlencoded,那么drf会根据 & 符号分割的形式去处理请求体。
user=wang&age=19 如果content-type:application/json,那么drf会根据 json 形式去处理请求体。
{"user":"wang","age":19}
- 序列化,可以对QuerySet进行序列化,也可以对用户提交的数据进行校验。
- 渲染器,可以帮我们把json数据渲染到页面上进行友好的展示。(内部会根据请求设备不同做不同的
展示)序列化:many=True or False
序列化:展示特殊的数据(choices、FK、M2M)可使用
depth
source,无需加括号,在源码内部会去判断是否可执行,如果可执行自动加括号。[fk/choice]
SerializerMethodField,定义钩子方法。[m2m]写程序的潜规则:约束
# 约束子类中必须实现f1
class Base(object):
def f1(self):
raise NotImplementedError('asdfasdfasdfasdf')
class Foo(Base):
def f1(self):
print(123)
obj = Foo()
obj.f1()面向对象的继承
class Base(object):
def f1(self):
print('base.f1')
self.f2()
def f2(self):
print('base.f2') class Foo(Base):
def f2(self):
print('foo.f2') obj = Foo()
obj.f1()
class Base(object):
x1 = 123
def f1(self):
print(self.x1)
class Foo(Base):
x1 = 456 obj = Foo()
obj.f1()
class APIView(object):
version_class = 123 def get_version(self):
print(self.version_class) class UserView(APIView):
version_class = 666 obj = UserView()
obj.get_version()
class APIView(object):
version_class = 123
def dispatch(self,method):
self.initial()
getattr(self,method)()
def initial(self):
print(self.version_class) class UserView(APIView):
version_class = 666
def get(self):
print('userview.get') obj = UserView()
obj.dispatch('get')
class URLPathVersion(object): def determin_version(self):
return 'v1' class APIView(object):
version_class = None
def dispatch(self,method):
version = self.initial()
print(version)
getattr(self,method)() def initial(self):
self.process_version() def process_version():
obj = self.version_class()
return obj.determine_version() class UserView(APIView):
version_class = URLPathVersion
分页
分页
1.1 PageNumberPagination
配置 settings.py
REST_FRAMEWORK = {
"PAGE_SIZE":2
}在视图的列表页面
from rest_framework.pagination import PageNumberPagination
from rest_framework import serializers class PageArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = "__all__" class PageArticleView(APIView): def get(self,request,*args,**kwargs):
queryset = models.Article.objects.all()
# 方式一:仅数据
"""
# 分页对象
page_object = PageNumberPagination()
# 调用 分页对象.paginate_queryset方法进行分页,得到的结果是分页之后的数据
# result就是分完页的一部分数据
result = page_object.paginate_queryset(queryset,request,self)
# 序列化分页之后的数据
ser = PageArticleSerializer(instance=result,many=True)
return Response(ser.data)
"""
# 方式二:数据 + 分页信息
"""
page_object = PageNumberPagination()
result = page_object.paginate_queryset(queryset, request, self)
ser = PageArticleSerializer(instance=result, many=True)
return page_object.get_paginated_response(ser.data)
"""
# 方式三:数据 + 部分分页信息
page_object = PageNumberPagination()
result = page_object.paginate_queryset(queryset, request, self)
ser = PageArticleSerializer(instance=result, many=True)
return Response({'count':page_object.page.paginator.count,'result':ser.data})LimitOffsetPagination
from rest_framework.pagination import PageNumberPagination
from rest_framework.pagination import LimitOffsetPagination
from rest_framework import serializers class PageArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = "__all__"
class HulaLimitOffsetPagination(LimitOffsetPagination):
max_limit = 2 class PageArticleView(APIView):
def get(self,request,*args,**kwargs):
queryset = models.Article.objects.all()
page_object = HulaLimitOffsetPagination()
result = page_object.paginate_queryset(queryset, request, self)
ser = PageArticleSerializer(instance=result, many=True)
return Response(ser.data)扩展
url(r'^page/view/article/$', views.PageViewArticleView.as_view()),
from rest_framework.generics import ListAPIView
class PageViewArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = "__all__"
class PageViewArticleView(ListAPIView):
queryset = models.Article.objects.all()
serializer_class = PageViewArticleSerializer
REST_FRAMEWORK = {
"PAGE_SIZE":2,
"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination"
}
drf分页功能的更多相关文章
- DRF框架中分页功能接口
目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...
- day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档
目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- drf 分页,获取fk,choise,m2m等字段数据(序列化)
1.什么是restful规范 是一套规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的的是,以前写增删改查需要写4个接口,restful规范的就是1个接口,根据method的 ...
- DjangoRestFramework框架三种分页功能的实现 - 在DjangoStarter项目模板中封装
前言 继续Django后端开发系列文章.刚好遇到一个分页的需求,就记录一下. Django作为一个"全家桶"型的框架,本身啥都有,分页组件也是有的,但默认的分页组件没有对API开发 ...
- 简单封装分页功能pageView.js
分页是一个很简单,通用的功能.作为一个有经验的前端开发人员,有义务把代码中类似这样公共的基础性的东西抽象出来,一来是改善代码的整体质量,更重要的是为了将来做类似的功能或者类似的项目,能减少不必要的重复 ...
- php对文本文件进行分页功能简单实现
php对文本文件进行分页功能简单实现 <!DOCTYPE> <html> <head> <meta http-equiv="Content-type ...
- Asp.net MVC3表格共用分页功能
在建立的mvc3项目中,在Razor(CSHTML)视图引擎下,数据会在表格中自动的生成,但分页没有好的控件实现,这里我们开发了设计了一个分页的模板,适合于没有数据提交和有数据提交的分页的分页. 第一 ...
- WinForm DataGridView分页功能
WinForm 里面的DataGridView不像WebForm里面的GridView那样有自带的分页功能,需要自己写代码来实现分页,效果如下图: 分页控件 .CS: 1 using System; ...
随机推荐
- Java IO: Buffered和Data
作者:Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中Buffered和data的输入输出流,主要涉及以下4个类型的流:Bu ...
- 记一笔MyBatis的坑
记一笔MyBatis的坑 1.sql查询concat()连接函数xml运行查询乱码 ) , ), char)'%') bll FROM fact_dkxx sq 由于连接的字符串中包含数字与百分比字符 ...
- 吴裕雄--天生自然python学习笔记:Beautiful Soup 4.2.0模块
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...
- Windows下使用swoole的环境搭建
Cygwin 官方地址:http://www.cygwin.com/ swoole 官方下载地址:https://github.com/swoole/swoole-src/releases 方法/步骤 ...
- python猜数字游戏快速求解解决方案
#coding=utf-8 def init_set(): r10=range(10) return [(i, j, k, l) for i in r10 for j in r10 for k in ...
- 后端开发中,可以在Cache-Control设置的常用指令
max-age 该指令指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒.例如:Cache-Control:max-age=60表示响应可以再缓存和重用 60 秒.需要注意的是,在max-a ...
- Dubbo、MQ等
1,Dubbo.MQ 1)Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 2)Dubbo采用全Spring配置方式,透明化接入应用,对应用没有 ...
- 确认下眼神!有没有遇上对的工资(测试leader)
屏蔽敏感信息,直接上图: ▼
- 初窥Android AudioFlinger
Android AudioFlinger 是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于 ...
- app后端用户登录api
app将用户名和密码发送到服务器,服务器验证用户名和密码都正确后,会在redis或memcached服务器中以用户id为键生成token字 符串,然后服务器把token字符串和用户id都返回给客户端( ...