url路由器、响应器、分页器、版本控制器
url路由器
authors为例:
这是我们以前写的url
urlpatterns = [
url(r'^authors/$',views.AuthorModelView.as_view({"get":"list","post":"create"})),
url(r'^authors/(?P<pk>\d+)/$',views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"})),
]
用REST的url后
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from rest_framework import routers
router=routers.DefaultRouter()
# 注册 一下做出来四条url,那两条只是我们不常用
router.register("authors",views.AuthorModelView)
urlpatterns = [
url("^",include(router.urls))
# url(r'^authors/$',views.AuthorModelView.as_view({"get":"list","post":"create"})),
# url(r'^authors/(?P<pk>\d+)/$',views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"})),
]
这两条url就是我们之前写的那种,还有两条没有介绍过,也不会介绍(不常用)
image.png访问下http://127.0.0.1:8000/authors.json 看看会有什么效果
[{"nid":1,"name":"moyan12","age":128,"authorDetail":1},{"nid":3,"name":"fuming","age":23442,"authorDetail":3},{"nid":5,"name":"moyan","age":128,"authorDetail":2}]
响应器
from rest_framework.viewsets import ModelViewSet
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class AuthorModelView(ModelViewSet):
# JSONRenderer JSON响应器
# BrowsableAPIRenderer 浏览器响应器
renderer_classes = [JSONRenderer]
# 以下这些格式是变量等都是固定的
queryset=Author.objects.all()
serializer_class=AuthorSerializers
分页器
# PageNumberPagination 类似于Django的分页器比较简单,还有一个较难的
from rest_framework.pagination import PageNumberPagination
class PageNumberPagination(BasePagination):
"""
A simple page number based style that supports page numbers as
query parameters. For example:
http://api.example.org/accounts/?page=4
http://api.example.org/accounts/?page=4&page_size=100
"""
# The default page size.
# Defaults to `None`, meaning pagination is disabled.
# 每页显示多少条数据
# api_settings 老相识了吧,settings里边没有配置就去找默认的,默认为None
page_size = api_settings.PAGE_SIZE
django_paginator_class = DjangoPaginator
# Client can control the page using this query parameter.
# 指定url分页的时候叫什么名字
page_query_param = 'page'
page_query_description = _('A page number within the paginated result set.')
# Client can control the page size using this query parameter.
# Default is 'None'. Set to eg 'page_size' to enable usage.
# 开启临时调整 page_size_query_param = 一个字符串,就是临时分页标志
page_size_query_param = None
page_size_query_description = _('Number of results to return per page.')
# Set to an integer to limit the maximum page size the client may request.
# Only relevant if 'page_size_query_param' has also been set.
# 临时调整最大显示多少条
max_page_size = None
last_page_strings = ('last',)
template = 'rest_framework/pagination/numbers.html'
invalid_page_message = _('Invalid page.')
分页器一
views.py
# PageNumberPagination 类似于Django的分页器比较简单,还有一个较难的
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
# 每页显示两条数据
page_size = 2
# 开启临时调整
page_size_query_param="size"
# 临时调整最大显示多少条
max_page_size=3
class BookView(APIView):
def get(self,request):
book_list=Book.objects.all()
# 实例化出一个对象
pagination=MyPageNumberPagination()
# 调用对象方法 得到的是querset数据
page_queryset=pagination.paginate_queryset(book_list,request)
# page_queryset得到的是querset数据,交给BookSerializers序列化后返回前端页面
ps=BookSerializers(page_queryset,many=True)
# 序列化完成的数据
return Response(ps.data)
分页器二
比如这些直接最大化封装(增删改查封装)的
# PageNumberPagination 类似于Django的分页器比较简单,还有一个较难的
from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
# 每页显示两条数据
page_size = 2
# 开启临时调整
page_size_query_param="size"
# 临时调整最大显示多少条
max_page_size=3
from rest_framework.viewsets import ModelViewSet
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class AuthorModelView(ModelViewSet):
# 响应器
renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
# 分页器 = 自己写的分页类,不能 = 列表了哦,分页一般不可能有多个吧?
pagination_class = MyPageNumberPagination
# 以下这些格式是变量等都是固定的
queryset=Author.objects.all()
serializer_class=AuthorSerializers
源码简单分析
我们一般在get查看所有数据的时候才会用到分页,所以看 mixins.ListModelMixin写了什么
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
# 看这不就是分页么? 那我们就没必要自己写,仅仅使用这个现成的不久OK了?
# 传进去queryset,分页器一:实际queryset=book_list,位置传参就省略了queryset,你下一步可以看下源码
page = self.paginate_queryset(queryset)
if page is not None:
# 序列化
serializer = self.get_serializer(page, many=True)
# 把序列化后的数据返回
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
http://127.0.0.1:8000/books/?size=6 # 根据临时分页最大显示多少条,超过就只会最大值
http://127.0.0.1:8000/books/?page=1&size=1 # 哪页临时显示多少条数据
网友评论