RestFramework

rest-framework框架的基本组件

	</h1>
	<div class="clear"></div>
	<div class="postBody">

快速实例

Quickstart

序列化

创建一个序列化类

简单使用

开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。

models部分:

复制代码
from django.db import models

# Create your models here.

class Book(models.Model):
title
=models.CharField(max_length=32)
price
=models.IntegerField()
pub_date
=models.DateField()
publish
=models.ForeignKey("Publish")
authors
=models.ManyToManyField("Author")
def str(self):
return self.title

class Publish(models.Model):
name
=models.CharField(max_length=32)
email
=models.EmailField()
def str(self):
return self.name

class Author(models.Model):
name
=models.CharField(max_length=32)
age
=models.IntegerField()
def str(self):
return self.name

复制代码

views部分:

复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers

from rest_framework import serializers

class BookSerializers(serializers.Serializer):
title
=serializers.CharField(max_length=32)
price
=serializers.IntegerField()
pub_date
=serializers.DateField()
publish
=serializers.CharField(source="publish.name")
#authors=serializers.CharField(source="authors.all")
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
temp
=[]
for author in obj.authors.all():
temp.append(author.name)
return temp

class BookViewSet(APIView):

</span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs):
    book_list</span>=<span style="color: #000000;">Book.objects.all()
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式1:</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> from django.forms.models import model_to_dict</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> import json</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> data=[]</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> for obj in book_list:</span>
    <span style="color: #008000;">#</span><span style="color: #008000;">     data.append(model_to_dict(obj))</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> print(data)</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse("ok")</span>

    <span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式2:</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> data=serializers.serialize("json",book_list)</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> return HttpResponse(data)</span>

    <span style="color: #008000;">#</span><span style="color: #008000;"> 序列化方式3:</span>
    bs=BookSerializers(book_list,many=<span style="color: #000000;">True)
    </span><span style="color: #0000ff;">return</span> Response(bs.data)</pre>
复制代码

ModelSerializer

class BookSerializers(serializers.ModelSerializer):
      class Meta:
          model=Book
          fields="__all__"
          depth=1

提交post请求

复制代码
  def post(self,request,*args,**kwargs):
    bs</span>=BookSerializers(data=request.data,many=<span style="color: #000000;">False)
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> print(bs.validated_data)</span>

bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)

复制代码

重写save中的create方法

复制代码
class BookSerializers(serializers.ModelSerializer):
  </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
      model</span>=<span style="color: #000000;">Book
      fields</span>=<span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span>
      <span style="color: #008000;">#</span><span style="color: #008000;"> exclude = ['authors',]</span>
      <span style="color: #008000;">#</span><span style="color: #008000;"> depth=1</span>

  <span style="color: #0000ff;">def</span><span style="color: #000000;"> create(self, validated_data):
    
      authors </span>= validated_data.pop(<span style="color: #800000;">'</span><span style="color: #800000;">authors</span><span style="color: #800000;">'</span><span style="color: #000000;">)
      obj </span>= Book.objects.create(**<span style="color: #000000;">validated_data)
      obj.authors.add(</span>*<span style="color: #000000;">authors)
      </span><span style="color: #0000ff;">return</span> obj</pre>
复制代码

 单条数据的get和put请求

复制代码
class BookDetailViewSet(APIView):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk):
    book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
    bs</span>=<span style="color: #000000;">BookSerializers(book_obj)
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk):
    book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
    bs</span>=BookSerializers(book_obj,data=<span style="color: #000000;">request.data)
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
        bs.save()
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        </span><span style="color: #0000ff;">return</span> HttpResponse(bs.errors)</pre>
复制代码

超链接API:Hyperlinked

复制代码
class BookSerializers(serializers.ModelSerializer):
      publish= serializers.HyperlinkedIdentityField(
view_name='publish_detail',
lookup_field="publish_id",
lookup_url_kwarg="pk") class Meta: model=Book fields="__all__" #depth=1
复制代码

urls部分:

1
2
3
4
5
6
urlpatterns = [
    url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),
    url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),
    url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),
    url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
]

视图三部曲

使用混合(mixins)

上一节的视图部分:

复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers

from rest_framework import serializers

class BookSerializers(serializers.ModelSerializer):
class Meta:
model
=Book
fields
="all"
#depth=1

class PublshSerializers(serializers.ModelSerializer):

  </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
      model</span>=<span style="color: #000000;">Publish
      fields</span>=<span style="color: #800000;">"</span><span style="color: #800000;">__all__</span><span style="color: #800000;">"</span><span style="color: #000000;">
      depth</span>=1

class BookViewSet(APIView):

</span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs):
    book_list</span>=<span style="color: #000000;">Book.objects.all()
    bs</span>=BookSerializers(book_list,many=True,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)


</span><span style="color: #0000ff;">def</span> post(self,request,*args,**<span style="color: #000000;">kwargs):
    </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(request.data)
    bs</span>=BookSerializers(data=request.data,many=<span style="color: #000000;">False)
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
        </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(bs.validated_data)
        bs.save()
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(bs.errors)

class BookDetailViewSet(APIView):

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk):
    book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
    bs</span>=BookSerializers(book_obj,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk):
    book_obj</span>=Book.objects.filter(pk=<span style="color: #000000;">pk).first()
    bs</span>=BookSerializers(book_obj,data=request.data,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
        bs.save()
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> HttpResponse(bs.errors)

class PublishViewSet(APIView):

</span><span style="color: #0000ff;">def</span> get(self,request,*args,**<span style="color: #000000;">kwargs):
    publish_list</span>=<span style="color: #000000;">Publish.objects.all()
    bs</span>=PublshSerializers(publish_list,many=True,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)


</span><span style="color: #0000ff;">def</span> post(self,request,*args,**<span style="color: #000000;">kwargs):

    bs</span>=PublshSerializers(data=request.data,many=<span style="color: #000000;">False)
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> print(bs.validated_data)</span>

bs.save()
return Response(bs.data)
else:
return HttpResponse(bs.errors)

class PublishDetailViewSet(APIView):

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> get(self,request,pk):

    publish_obj</span>=Publish.objects.filter(pk=<span style="color: #000000;">pk).first()
    bs</span>=PublshSerializers(publish_obj,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> put(self,request,pk):
    publish_obj</span>=Publish.objects.filter(pk=<span style="color: #000000;">pk).first()
    bs</span>=PublshSerializers(publish_obj,data=request.data,context={<span style="color: #800000;">'</span><span style="color: #800000;">request</span><span style="color: #800000;">'</span><span style="color: #000000;">: request})
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> bs.is_valid():
        bs.save()
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Response(bs.data)
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        </span><span style="color: #0000ff;">return</span> HttpResponse(bs.errors)</pre>
复制代码

mixin类编写视图

复制代码
from rest_framework import mixins
from rest_framework import generics

class BookViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):

queryset </span>=<span style="color: #000000;"> Book.objects.all()
serializer_class </span>=<span style="color: #000000;"> BookSerializers

</span><span style="color: #0000ff;">def</span> get(self, request, *args, **<span style="color: #000000;">kwargs):
    </span><span style="color: #0000ff;">return</span> self.list(request, *args, **<span style="color: #000000;">kwargs)

</span><span style="color: #0000ff;">def</span> post(self, request, *args, **<span style="color: #000000;">kwargs):
    </span><span style="color: #0000ff;">return</span> self.create(request, *args, **<span style="color: #000000;">kwargs)

class BookDetailViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset
= Book.objects.all()
serializer_class
= BookSerializers

</span><span style="color: #0000ff;">def</span> get(self, request, *args, **<span style="color: #000000;">kwargs):
    </span><span style="color: #0000ff;">return</span> self.retrieve(request, *args, **<span style="color: #000000;">kwargs)

</span><span style="color: #0000ff;">def</span> put(self, request, *args, **<span style="color: #000000;">kwargs):
    </span><span style="color: #0000ff;">return</span> self.update(request, *args, **<span style="color: #000000;">kwargs)

</span><span style="color: #0000ff;">def</span> delete(self, request, *args, **<span style="color: #000000;">kwargs):
    </span><span style="color: #0000ff;">return</span> self.destroy(request, *args, **kwargs)</pre>
复制代码

使用通用的基于类的视图

通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

复制代码
from rest_framework import mixins
from rest_framework import generics

class BookViewSet(generics.ListCreateAPIView):

queryset </span>=<span style="color: #000000;"> Book.objects.all()
serializer_class </span>=<span style="color: #000000;"> BookSerializers

class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
queryset
= Book.objects.all()
serializer_class
= BookSerializers

class PublishViewSet(generics.ListCreateAPIView):

queryset </span>=<span style="color: #000000;"> Publish.objects.all()
serializer_class </span>=<span style="color: #000000;"> PublshSerializers

class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
queryset
= Publish.objects.all()
serializer_class
= PublshSerializers

复制代码

viewsets.ModelViewSet

urls.py:

复制代码
    url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"),
    url(r'^books/(?P<pk>\d+)$', views.BookViewSet.as_view({
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy'
            }),name="book_detail"),
复制代码

views.py:

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

认证与权限组件

认证组件

局部视图认证

在app01.service.auth.py:

复制代码
class Authentication(BaseAuthentication):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> authenticate(self,request):
    token</span>=request._request.GET.get(<span style="color: #800000;">"</span><span style="color: #800000;">token</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    token_obj</span>=UserToken.objects.filter(token=<span style="color: #000000;">token).first()
    </span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> token_obj:
        </span><span style="color: #0000ff;">raise</span> exceptions.AuthenticationFailed(<span style="color: #800000;">"</span><span style="color: #800000;">验证失败!</span><span style="color: #800000;">"</span><span style="color: #000000;">)
    </span><span style="color: #0000ff;">return</span> (token_obj.user,token_obj)</pre>
复制代码

在views.py:

复制代码
def get_random_str(user):
    import hashlib,time
    ctime=str(time.time())
md5</span>=hashlib.md5(bytes(user,encoding=<span style="color: #800000;">"</span><span style="color: #800000;">utf8</span><span style="color: #800000;">"</span><span style="color: #000000;">))
md5.update(bytes(ctime,encoding</span>=<span style="color: #800000;">"</span><span style="color: #800000;">utf8</span><span style="color: #800000;">"</span><span style="color: #000000;">))

</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> md5.hexdigest()

from app01.service.auth import *

from django.http import JsonResponse
class LoginViewSet(APIView):
authentication_classes
= [Authentication,]
def post(self,request,*args,**kwargs):
res
={"code":1000,"msg":None}
try:
user
=request._request.POST.get("user")
pwd
=request._request.POST.get("pwd")
user_obj
=UserInfo.objects.filter(user=user,pwd=pwd).first()
print(user,pwd,user_obj)
if not user_obj:
res[
"code"]=1001
res[
"msg"]="用户名或者密码错误"
else:
token
=get_random_str(user)
UserToken.objects.update_or_create(user
=user_obj,defaults={"token":token})
res[
"token"]=token

    </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> Exception as e:
        res[</span><span style="color: #800000;">"</span><span style="color: #800000;">code</span><span style="color: #800000;">"</span>]=1002<span style="color: #000000;">
        res[</span><span style="color: #800000;">"</span><span style="color: #800000;">msg</span><span style="color: #800000;">"</span>]=<span style="color: #000000;">e

    </span><span style="color: #0000ff;">return</span> JsonResponse(res,json_dumps_params={<span style="color: #800000;">"</span><span style="color: #800000;">ensure_ascii</span><span style="color: #800000;">"</span>:False})</pre>
复制代码

全局视图认证组件

settings.py配置如下:

1
2
3
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
}

权限组件

局部视图权限

在app01.service.permissions.py中:

复制代码
from rest_framework.permissions import BasePermission
class SVIPPermission(BasePermission):
    message="SVIP才能访问!"
    def has_permission(self, request, view):
        if request.user.user_type==3:
            return True
        return False
复制代码

在views.py:

from app01.service.permissions import *

class BookViewSet(generics.ListCreateAPIView):
permission_classes
= [SVIPPermission,]
queryset
= Book.objects.all()
serializer_class
= BookSerializers

全局视图权限

settings.py配置如下:

1
2
3
4
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
}

throttle(访问频率)组件

局部视图throttle

在app01.service.throttles.py中:

复制代码
from rest_framework.throttling import BaseThrottle

VISIT_RECORD={}
class VisitThrottle(BaseThrottle):

</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span><span style="color: #000000;">(self):
    self.history</span>=<span style="color: #000000;">None

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> allow_request(self,request,view):
    remote_addr </span>= request.META.get(<span style="color: #800000;">'</span><span style="color: #800000;">REMOTE_ADDR</span><span style="color: #800000;">'</span><span style="color: #000000;">)
    </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(remote_addr)
    </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> time
    ctime</span>=<span style="color: #000000;">time.time()

    </span><span style="color: #0000ff;">if</span> remote_addr <span style="color: #0000ff;">not</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> VISIT_RECORD:
        VISIT_RECORD[remote_addr]</span>=<span style="color: #000000;">[ctime,]
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True

    history</span>=<span style="color: #000000;">VISIT_RECORD.get(remote_addr)
    self.history</span>=<span style="color: #000000;">history

    </span><span style="color: #0000ff;">while</span> history <span style="color: #0000ff;">and</span> history[-1]&lt;ctime-60<span style="color: #000000;">:
        history.pop()

    </span><span style="color: #0000ff;">if</span> len(history)&lt;3<span style="color: #000000;">:
        history.insert(0,ctime)
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> False

</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> wait(self):
    </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> time
    ctime</span>=<span style="color: #000000;">time.time()
    </span><span style="color: #0000ff;">return</span> 60-(ctime-self.history[-1])</pre>
复制代码

在views.py中:

from app01.service.throttles import *

class BookViewSet(generics.ListCreateAPIView):
throttle_classes
= [VisitThrottle,]
queryset
= Book.objects.all()
serializer_class
= BookSerializers

全局视图throttle

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
    "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",]
}

内置throttle类

在app01.service.throttles.py修改为:

class VisitThrottle(SimpleRateThrottle):
scope</span>=<span style="color: #800000;">"</span><span style="color: #800000;">visit_rate</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">def</span><span style="color: #000000;"> get_cache_key(self, request, view):

    </span><span style="color: #0000ff;">return</span> self.get_ident(request)</pre>

settings.py设置:

复制代码
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
    "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
    "DEFAULT_THROTTLE_RATES":{
        "visit_rate":"5/m",
    }
}
复制代码

解析器

request类

django的request类和rest-framework的request类的源码解析

局部视图

复制代码
from rest_framework.parsers import JSONParser,FormParser
class PublishViewSet(generics.ListCreateAPIView):
    parser_classes = [FormParser,JSONParser]
    queryset = Publish.objects.all()
    serializer_class = PublshSerializers
    def post(self, request, *args, **kwargs):
        print("request.data",request.data)
        return self.create(request, *args, **kwargs)
复制代码

全局视图

复制代码
REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
    "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
    "DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
    "DEFAULT_THROTTLE_RATES":{
        "visit_rate":"5/m",
    },
    "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}
复制代码

分页

简单分页

复制代码
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination

class PNPagination(PageNumberPagination):
page_size
= 1
page_query_param
= 'page'
page_size_query_param
= "size"
max_page_size
= 5

class BookViewSet(viewsets.ModelViewSet):

queryset </span>=<span style="color: #000000;"> Book.objects.all()
serializer_class </span>=<span style="color: #000000;"> BookSerializers
</span><span style="color: #0000ff;">def</span> list(self,request,*args,**<span style="color: #000000;">kwargs):

    book_list</span>=<span style="color: #000000;">Book.objects.all()
    pp</span>=<span style="color: #000000;">LimitOffsetPagination()
    pager_books</span>=pp.paginate_queryset(queryset=book_list,request=request,view=<span style="color: #000000;">self)
    </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(pager_books)
    bs</span>=BookSerializers(pager_books,many=<span style="color: #000000;">True)

    </span><span style="color: #008000;">#</span><span style="color: #008000;">return Response(bs.data)</span>
    <span style="color: #0000ff;">return</span> pp.get_paginated_response(bs.data)</pre>
复制代码

偏移分页

from rest_framework.pagination import LimitOffsetPagination

 

 

 

 

 

  

 

 

<div id="blog_post_info">
4
1
<div class="clear"></div>
<div id="post_next_prev"></div>

posted @ 2018-04-04 22:16 Yuan先生 阅读(5744) 评论(0) 编辑 收藏
(评论功能已被禁用)
<div id="cnblogs_c2" class="c_ad_block">
    <div id="div-gpt-ad-1539008685004-0" style="height:60px; width:468px;" data-google-query-id="CKzQtKj6ieUCFYuJlgodmhAJ_g">
        
    <div id="google_ads_iframe_/1090369/C2_0__container__" style="border: 0pt none;"><iframe id="google_ads_iframe_/1090369/C2_0" title="3rd party ad content" name="google_ads_iframe_/1090369/C2_0" width="468" height="60" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" srcdoc="" style="border: 0px; vertical-align: bottom;" data-google-container-id="2" data-load-complete="true"></iframe></div></div>
</div>
<div id="under_post_kb">
posted @ 2019-10-07 18:40  呵!小鹿  阅读(390)  评论(0编辑  收藏  举报