美文网首页
Rest framework-url路由器、响应器、分页器、版本

Rest framework-url路由器、响应器、分页器、版本

作者: 墨颜丶 | 来源:发表于2018-08-07 21:04 被阅读0次

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 # 哪页临时显示多少条数据

版本控制器-待更

相关文章

网友评论

      本文标题:Rest framework-url路由器、响应器、分页器、版本

      本文链接:https://www.haomeiwen.com/subject/guhzvftx.html