django的rest framework框架——分页、视图、路由、渲染器
一、rest framework的分页
1、使用rest framework内置类PageNumberPagination实现分类
from django.conf.urls import url
from api import views urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/pager1/$', views.Pager1View.as_view()),
]
urls.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination from api import models
from api.utils.serializers.pager import PagerSerializer class Pager1View(APIView):
"""分页"""
def get(self, request, *args, **kwargs):
roles = models.Role.objects.all()
# 使用PageNumberPagination类进行分页
pg = PageNumberPagination()
# 获取分页数据
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 序列化分页结果
serl = PagerSerializer(instance=pager_roles, many=True)
return Response(serl.data)
views.py


2、继承内置类自定义分页
from rest_framework.views import APIView
from rest_framework.pagination import PageNumberPagination
from api import models
from api.utils.serializers.pager import PagerSerializer class MyPageNumberPagination(PageNumberPagination):
"""自定义分页类"""
page_size = 2 # 设置一页显示2条数据
# page_size_query_param = None # 设置请求参数的key
# 设置为size 可以在请求参数重置每页显示的数据条数
page_size_query_param = "size" # http://127.0.0.1:8082/api/v1/pager1/?size=3
max_page_size = 5 # 设置每页最大显示的数据条数 page_query_param = 'page' # 获取页码 http://127.0.0.1:8082/api/v1/pager1/?page=2 获取第二页数据 class Pager1View(APIView):
"""分页显示"""
def get(self, request, *args, **kwargs): roles = models.Role.objects.all()
pg = MyPageNumberPagination()
# 获取分页数据
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 序列化分页结果
serl = PagerSerializer(instance=pager_roles, many=True) # return Response(serl.data) # 还可以使用内置方法返回数据
res = pg.get_paginated_response(serl.data)
return res
views.py
3、LimitOffsetPagination类
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
from api import models
from api.utils.serializers.pager import PagerSerializer class Pager1View(APIView):
"""分页显示"""
def get(self, request, *args, **kwargs): roles = models.Role.objects.all()
pg = LimitOffsetPagination() # 使用的是offset设置索引的ID
# http://127.0.0.1:8082/api/v1/pager1/?offset=2 表示从第3条数据开始显示
# http://127.0.0.1:8082/api/v1/pager1/?offset=2&limit=4 表示从第3条数据开始向后取4条
# 获取分页数据
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 序列化分页结果
serl = PagerSerializer(instance=pager_roles, many=True) return Response(serl.data)
views.py
4、CursorPagination类
from rest_framework.views import APIView
from rest_framework.pagination import CursorPagination
from api import models
from api.utils.serializers.pager import PagerSerializer class MyCursorPagination(CursorPagination):
"""自定义分页类"""
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id' # 获取数据时的排序规则
page_size_query_param = None
max_page_size = None class Pager1View(APIView):
"""分页显示"""
def get(self, request, *args, **kwargs): roles = models.Role.objects.all()
pg = MyCursorPagination()
# 获取分页数据
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
# 序列化分页结果
serl = PagerSerializer(instance=pager_roles, many=True) res = pg.get_paginated_response(serl.data)
return res
views.py

二、rest framework的视图
1、APIView
from django.conf.urls import url
from api import views urlpatterns = [
url(r'^(?P<version>[v1|2]+)/viewer/$', views.ViewerView.as_view()),
]
urls.py
from rest_framework.views import APIView
from rest_framework.response import Response class ViewerView(APIView):
"""继承APIView"""
def get(self, request, *args, **kwargs):
return Response("xxx")
views.py
2、GenericAPIView




from django.db import models class UserGroup(models.Model):
title = models.CharField(max_length=32) class UserInfo(models.Model):
user_type_choices = (
(1, "普通用户"),
(2, "vip"),
(3, "svip"),
)
user_type = models.IntegerField(choices=user_type_choices)
username = models.CharField(max_length=32, unique=True)
password = models.CharField(max_length=64)
group = models.ForeignKey(to="UserGroup", on_delete=models.CASCADE, null=True, blank=True)
roles = models.ManyToManyField(to="Role", blank=True) class UserToken(models.Model):
user = models.OneToOneField(to="UserInfo")
token = models.CharField(max_length=64) class Role(models.Model):
title = models.CharField(max_length=32) class Order(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
create_time = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(to="UserInfo", on_delete=models.CASCADE, null=True, blank=True)
models.py
from django.conf.urls import url
from api import views urlpatterns = [
url(r'^(?P<version>[v1|2]+)/viewer/$', views.ViewerView.as_view()),
]
urls.py

from rest_framework import serializers
from api import models class ViewSerializer(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"
view_serializer.py
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination from api import models
from api.utils.serializers.view_serializer import ViewSerializer class ViewerView(GenericAPIView):
"""继承GenericAPIView"""
queryset = models.Role.objects.all() # 指定要查询的数据
serializer_class = ViewSerializer # 序列化类
pagination_class = PageNumberPagination # 分页类 def get(self, request, *args, **kwargs):
roles = self.get_queryset() # 获取数据
pager = self.paginate_queryset(roles) # 分页
serl = self.get_serializer(instance=pager, many=True) # 序列化
return Response(serl.data)
views.py
3、GenericViewSet
继承了ViewSetMixin和GenericAPIView
from django.conf.urls import url
from api import views urlpatterns = [
url(r'^(?P<version>[v1|2]+)/viewer/$', views.ViewerView.as_view({'get': 'list'})),
]
urls.py
from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination from api import models
from api.utils.serializers.view_serializer import ViewSerializer class ViewerView(GenericViewSet):
"""继承GenericViewSet"""
queryset = models.Role.objects.all() # 指定要查询的数据
serializer_class = ViewSerializer # 序列化类
pagination_class = PageNumberPagination # 分页类 def list(self, request, *args, **kwargs):
roles = self.get_queryset() # 获取数据
pager = self.paginate_queryset(roles) # 分页
serl = self.get_serializer(instance=pager, many=True) # 序列化
return Response(serl.data)
views.py
4、ListModelMixin、CreateModelMixin、GenericViewSet
ListModelMixin内部实现了list方法:

CreateModelMixin内部实现了create方法:

from django.conf.urls import url
from api import views urlpatterns = [
url(r'^(?P<version>[v1|2]+)/viewer/$', views.ViewerView.as_view({'get': 'list', 'post': 'create'})),
]
urls.py
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.pagination import PageNumberPagination from api import models
from api.utils.serializers.view_serializer import ViewSerializer class ViewerView(ListModelMixin, CreateModelMixin, GenericViewSet):
"""继承ListModelMixin、CreateModelMixin、GenericViewSet"""
queryset = models.Role.objects.all() # 指定要查询的数据
serializer_class = ViewSerializer # 序列化类
pagination_class = PageNumberPagination # 分页类
views.py

5、ModelViewSet


获取单条数据、更新数据、删除数据时,URL中需要传递要操作的数据的ID
from django.conf.urls import url
from api import views urlpatterns = [
url(r'^(?P<version>[v1|2]+)/viewer/(?P<pk>\d+)$', views.ViewerView.as_view({'get': 'retrieve',
'post': 'create',
'delete': 'destroy',
'put': 'update',
'patch': 'partial_update'})),
]
urls.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.pagination import PageNumberPagination from api import models
from api.utils.serializers.view_serializer import ViewSerializer class ViewerView(ModelViewSet):
"""继承ModelViewSet"""
queryset = models.Role.objects.all() # 指定要查询的数据
serializer_class = ViewSerializer # 序列化类
pagination_class = PageNumberPagination # 分页类
views.py
6、当使用GenericViewSet类时,会执行它父类GenericAPIView里面的get_object方法,这个方法执行了check_object_permissions方法来对对象的权限进行校验:


三、rest framework的路由
url(r'^(?P<version>[v1|2]+)/viewer/$', views.ViewerView.as_view())
# http://127.0.0.1:8080/api/v2/viewer/ url(r'^(?P<version>[v1|2]+)/viewer/$', views.ViewerView.as_view({'get': 'list', 'post': 'create'}))
# http://127.0.0.1:8080/api/v2/viewer/
# http://127.0.0.1:8080/api/v2/viewer/?format=json get传参的方式 url(r'^(?P<version>[v1|2]+)/viewer\.(?P<format>\w+)$', views.ViewerView.as_view({'get': 'list', 'post': 'create'}))
# http://127.0.0.1:8080/api/v2/viewer.json 将参数写到路径里面
自动生成路由:
from django.conf.urls import url, include
from rest_framework import routers
from api import views router = routers.DefaultRouter()
router.register(r"role", views.ViewerView) # url前缀,视图名称
router.register(r"group", views.ViewerView) urlpatterns = [
url(r'^(?P<version>[v1|2]+)/', include(router.urls)),
]
urls.py
自动生成的路由:

可以通过http://127.0.0.1:8080/api/v2/role/ http://127.0.0.1:8080/api/v2/role.json等方式进行访问
四、rest framework的渲染器
1、局部配置
urlpatterns = [
url(r'^(?P<version>[v1|2]+)/test/$', views.TestView.as_view()),
]
urls.py

from rest_framework import serializers
from api import models class ViewSerializer(serializers.ModelSerializer):
class Meta:
model = models.Role
fields = "__all__"
view_serializer.py
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer, AdminRenderer from api import models
from api.utils.serializers.view_serializer import ViewSerializer class TestView(APIView):
renderer_classes = [JSONRenderer, BrowsableAPIRenderer] # 渲染数据格式的类 http://127.0.0.1:8080/api/v2/test/?format=json
# renderer_classes = [AdminRenderer, BrowsableAPIRenderer] # 渲染数据格式的类 http://127.0.0.1:8080/api/v2/test/?format=admin def get(self, request, *args, **kwargs):
roles = models.Role.objects.all()
pg = PageNumberPagination()
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)
serl = ViewSerializer(instance=pager_roles, many=True)
return Response(serl.data)
views.py
2、全局配置
在项目的settings里面:

django的rest framework框架——分页、视图、路由、渲染器的更多相关文章
- Django-RestFrameWork之分页 视图 路由 渲染器
目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一 ...
- 基于Django的Rest Framework框架的视图组件
本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateDestroyAPIView 四 使用 ...
- Django之Rest Framework框架
一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...
- Django rest framework(8)---- 视图和渲染器
django rest framework 之视图 序列化器 PagerSerialiser from rest_framework import serializers from api im ...
- django的rest framework框架——安装及基本使用
一.django的FBV 和 CBV 1.FBV(基于函数的视图): urlpatterns = [ url(r'^users/', views.users), ] def users(request ...
- 基于Django的Rest Framework框架的url控制器
本文目录 一 自定义路由(原始方式) 二 半自动路由(视图类继承ModelViewSet) 三 全自动路由(自动生成路由) 回到目录 一 自定义路由(原始方式) from django.conf.ur ...
- Django:(05)类视图,装饰器和中间件
一.类视图的定义和使用 在Django中还可以通过类来定义一个视图,称为类视图. 定义一个类视图:定义一个类,需继承 Django 提供的 View 类 . from django.views.gen ...
- 基于Django的Rest Framework框架的分页组件
本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...
- django的rest framework框架——版本、解析器、序列化
一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...
随机推荐
- 修复在unix系统里的文件打开不能显示正常的颜色问题
在mac上面看到mysql的配置文件的颜色永远是白色,为了让配置文件的颜色更加分明些,这个时候只需进入到home目录下新建一个.vimrc文件, vim .vimrc set nu syntax o ...
- linux 打开FTP 功能
http://blog.csdn.net/jay285979220/article/details/62216622 今天在linux上安装完了vsftpd后,使用root账号一直无法登陆到服务器上. ...
- 51nod 1640 天气晴朗的魔法 二分 + 克鲁斯卡算法(kruskal算法) 做复杂了
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 一开始想的时候,看到要使得最大值最小,那这样肯定是二分这个最大值了 ...
- light OJ 1282 - Leading and Trailing 数学 || double技巧
http://lightoj.com/volume_showproblem.php?problem=1282 #include <cstdio> #include <cstdlib& ...
- Ubuntu安装LAMP
1.安装apache2 sudo apt-get install apache2 sudo apt-get install apache2 Apache安装成功后,/var/www/默认作为web的根 ...
- 解决“程序包管理器控制台”输入命令找不到Nuget包问题
问题: 问题原因: Nuget源的地址上不去 解决办法: 1.将Nuget源更新为可以国内使用的官方Nuget源. 1)打开VS2013:工具-->Nuget程序包管理器-->程序包管理器 ...
- JDk安装及环境变量的配置
一.JDK的安装 1.打开下载好的安装包(我在这里附上一个百度云连接,https://pan.baidu.com/s/1o3nx0kbmecAISeneGqykLQ 提取码:jnw6) 傻瓜式安 ...
- SpringBoot学习笔记-Chapter2(hello word)
开篇 第一次在博客园上写博客,初衷是想记录一下学习笔记,以往都是用笔去记录下学习笔记,现在来看在效率.检索速度上以及可可复制性都不好.作为一名Java开发人员 不会Spring Boot一定会被鄙视的 ...
- kafka客户端发布record(消息)
kafka客户端发布record(消息)到kafka集群. 新的生产者是线程安全的,在线程之间共享单个生产者实例,通常单例比多个实例要快. 一个简单的例子,使用producer发送一个有序的key/v ...
- vue+webpack+VS Code入门简单的项目配置
为了方便,这边的编译器选择的是VS Code (Visual Studio Code); 打开VS Code,选择好自己的工作空间,然后新建一个文件夹作为我们项目的文件夹,然后,show time: ...