Django Rest Framework 教程及API嚮導。python
1、請求(Request)
REST_FRAMEWORK 中的 Request 擴展了標準的HttpRequest,爲 REST_FRAMEWORK增長了靈活的request解析和request認證。
一、請求
.data: 獲取請求的主體,至關於request.POST和request.FILES
.query_params: request.GET的重命名
.parsers: APIView類或@api_view裝飾將確保這個屬性將自動設置爲一個解析器實例列表
二、內容協商
.accepted_render: 接受渲染一個對象內容協商
.accepted_media_type: 接受的媒體類型
三、身份驗證
.user: 一般返回django.contrib.auth.models.user的對象。雖然行爲取決於所使用的身份驗證策略。
若是請求用戶沒有被認證,request.user是一個django.contrib.auth.models.Anoymoser對象。
.auth: 被認證的後纔會被使用,返回任何額外身份的環境。
.authenticators: APIView類或@api_view裝飾將確保這個屬性將自動設置爲一個認證明例列表
四、瀏覽器加強方法
django rest framework提供一些附加的表單提交方法:PUT,PATCH,DELETE
.method: 返回一個大寫的HTTP請求方法字符串,包含了PUT,PATCH,DELETE等。
.content_type: 返回一個字符串對象表明HTTP請求的媒體類型的身體,或若是沒有媒體類型提供一個空字符串。
一樣可使用:request.META.get(‘HTTP_CONTENT_TYPE’)
.stream: 返回一個請求主體類容的流。
五、 支持其餘標準的HttpResquest屬性
.META/.session/等等
2、Response(響應)
你須要使用一個APIView類或@api_view函數返回response對象的views
一、建立Response
from rest_framework.response import Response
例: Response(data, status=None, template_name=None, headers=None, content_type=None)
data: 響應serialized(序列化)後的數據
status: 定義響應狀態碼,默認200
template_name: 若是HTMLRender被選擇,返回一個模板
headers: 是關於HTTP請求頭的一個字典
content_type: 響應內容類型,通常會根據內容自動協商。
二、其餘標準的HttpResponse屬性
response = Response()
response[‘Cache-Control’] = ‘no-cache’
.render(): 響應序列化的數據。
3、基本視圖類 (APIView/@api_view)
一、類基礎視圖(APIView)
DRF不一樣於django常規的view類,他有以下幾點優勢:
* 提供了更好用的request對象,不一樣於普通的django HttpRequest更好用。
* 封裝了Response對象,代替了原有的django HttpResponse,視圖將管理內容協商並設置正確的渲染器的響應。
* 任何APIException異常將會被捕捉,並作適當的響應。
* 傳入的請求將身份驗證和適當的權限和節流檢查將以前運行調度請求處理程序的方法。
一個小例子:正則表達式
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import authenication, permissions class ListUser(APIView): 「」」
展現系統中全部的用戶
* 須要令牌認證。
* 只有admin用戶可以訪問這一個視圖數據庫
""" authentication_classes = (authentication.TokenAuthentication,) # 認證策略屬性 permission_classes = (permissions.IsAdminUser,) # 權限策略屬性 def get(self, requeset, format=None): """ 返回一個用戶列表 """ usernames = [user.username for user in User.objects.all()] return Response(usernames)
1) API策略屬性
如下的API策略屬性應用於APIView,控制視圖的策略:
renderer_classes: 渲染器類
parser_classes: 解釋器類
authentication_classes: 權限類
throttle_classes:節流類
permission_classes: 權限類
content_negotiation_class: 內容協商類
2)API 策略方法
如下的策略方法用在API的策略,一般不用重寫它:
get_renderers(self): 獲取渲染器方法
get_parsers(self): 獲取解釋器方法
get_authenticators(self): 或缺認證方法
get_throttles(self): 獲取節流方法
get_permissions(self): 獲取權限方法
get_content_negotiator(self): 獲取內容協商方法
3)API策略實施方法
下列方法以前被稱爲調度處理程序方法:
check_permissions(self, request): 檢查權限
check_throttles(self, request): 檢查節流
check_content_negotiation(self, request, force=False): 檢查內容協商
4)調度方法
這些執行任何操做,須要發生以前或以後調用處理程序方法等.
initial(self, request, *args, **kwargs): 執行任何操做,須要發生在處理程序方法以前被調用。這個方法是用來執行權限和節流,並執行內容協商。
handle_exception(self, exc):拋出的任何異常處理程序方法將被傳遞給這個方法,而返回響應實例,或者re-raises異常。
initialize_request(self, request, *args, **kwargs):確保請求對象傳遞給處理程序方法是request的一個實例,而不是django的HttpRequest
finalize_response(self, request, response, *args, **kwargs):確保任何響應處理程序方法返回的對象將被呈現到正確的內容類型
二、函數基礎視圖(@api_view())
DRF一樣提供了另一種函數基礎視圖來裝飾django的普通視圖,咱們一樣可使用request來接受請求和response響應。
一個小例子:django
from rest_framework.decorators import api_view @api_view def hello_world(request): return Response({「message」:」Hello world!」})
1)api_view()使用方法
這個視圖將使用默認渲染器、解析器、身份驗證設置中指定的類等。一般默認只有GET方法,其餘請求方法會報405錯誤,咱們能夠手動添加方法爲這
裝飾器指定request方法。像這樣:json
@api_view([‘GET’, ‘POST’]) def hello_world(request): if request.method == ‘POST’: return Response({「message」:」Got some data」, 「data」: request.data}) return Response({「messsage」:」Hello world!」})
2)API策略裝飾器
DRF提供了不少附加的裝飾器,咱們能夠添加到@api_view()後面,例如要加入一個節流的裝飾器來確保特定用戶天天只能一次經過這個視圖,我
咱們就要用到@throttle_classes裝飾器:api
from rest_framework.decorators import api_view, throttle_classes from rest_framework.throttling import UserRateThrottle class OncePerDayUserThrottle(UserRateThrottle): rate = 「1/day」 @api_view([‘GET’]) @throttle_classes([OncePerDayUserThrottle]) def view(request): return Response({「message」:」Hello for to day! see you tomorrow!」})
其餘可用API的裝飾器:
@renderer_classes(…)
@parser_classes(…)
@authentication_classes(…)
@throttle_classes(…)
@permission_classes(…)
4、 通用視圖(Generic views)
基於類視圖的主要好處之一是他們容許您編寫可重用的行爲.
REST框架提供的通用視圖容許您快速構建API觀點緊密地映射到您的數據庫模型.
若是通用視圖不適合你的須要API,您可使用常規APIView類,或重用mixin和基類使用的通用視圖來組成本身的組可重用通用視圖。
一、通用視圖
一樣咱們能夠設置一些類屬性在通用視圖內,也能夠根據特殊要寫重寫它的內部視圖方法。一個小例子:瀏覽器
from django.contrib.auth.models import User from myapp.serializers import UserSerializer from rest_framework import generics from rest_framework.permissions import IsAdminUser class UserList(generics.ListCreateAPIView): queryset = User.objects.all() serializer_class = UserSerializer permission_classes = (IsAdminUser,) def list(self, request): # Note the use of get_queryset() instead of self.queryset queryset = self.get_queryset() serializer = UserSerializer(queryset, many=True) return Response(serializer.data)
在urls配置中,咱們可使用.as_views()來轉換成視圖函數,固然也能夠配置一些屬性session
url(r’^/users/’, ListCreateAPIView.as_view(queryset=User.objects.all(), serializer_class=UserSerializer), name=’user-list’)
二、GenericAPIView通用視圖API參考:
GenericAPIView繼承了DRF的APIView類,爲list和detail視圖增長了一些通常需求行爲方法(提供queryset)。
1)屬性
基本屬性:
queryset: 用於返回query對象集合,也可使用get_queryset()方法。
serializer_class: 序列化器類,應該用於輸入進行驗證和反序列化,並用於序列化輸出。一般狀況下,你必須設置這個屬性,或重寫get_serializer_class()方法。
lookup_field: 模型的字段應該用於執行對象查找個別的模型實例
ookup_url_kwarg:URL應該用於對象查找關鍵字參數app
分頁屬性:
pagination_class: 用於返回一個分頁列表視圖的分頁類,默認與settings中設置的DEFAULT_PAGINATION_CLASS 值相同,
能夠經過’rest_framework.pagination.PageNumberPagination’設置分頁數
過濾器屬性:
filter_backends: 過濾queryset的類列表,和在settings中設置DEFAULT_FILTER_BACKENDS 同樣
2)方法
基本方法:
get_queryset(): 返回queryset。(詳情見官網http://www.django-rest-framework.org/api-guide/generic-views/)
get_object():獲取某一個具體的model實例對象。
保存與刪除掛鉤方法:
如下方法是mixins類提供,提供簡單的對象保存和刪除的行爲重寫:
perform_create(self, serializer): CreateModelMixin 當要保存對象時候會被調用
perform_update(self, serializer):UpdateModelMixin 當要更新對象時候會被調用
perform_destroy(self, instance): DestoryModelMixin 當藥刪除對象時候會被調用
三、Mixins
mixin類提供用於提供基礎視圖的操做行爲。注意,mixin類提供操做方法而不是定義處理程序方法,好比. get()和. post(),直接。這容許更靈活的組合的行爲。
經過rest_framework.mixins引用。
ListModelMixin:提供list方法,列出queryset
CreateModelMixin: 提供create方法,建立和保存一個Model對象
RetrieveModelMixin:提供retrieve方法,檢索一個存在的model對象
UpdateModelMixin: 提供Update方法,更改一個模型對象
DestroyModelMixin:提供destroy方法,刪除一個模型對象
4)Generic
Generic通用視圖類提供具體操做的通用視圖類,能夠理解爲Generic.GenericAPIView和mixin類的合體,經過rest_framework.generic.調用
.CreateAPIView:
建立一個模型實例
提供post方法的處理器
繼承於:GenericAPIView,CreateModelMixin
.ListAPIView:
模型實例的集合
提供get方法處理器
繼承於:GenericAPIView,ListModelMixin
.RetrieveAPIView:
一個模型實例
提供get方法處理器
繼承於:GenericAPIView,RetrieveModelMixin
.DestoryAPIView:
刪除一個模型實例
提供delete方法處理器
繼承於:GenericAPIView,DestroyModelMixin
.UpdateAPIView:
修改模型實例,
提供put和patch方法處理器
繼承於:GenericAPIView,UpdateModelMixin
.ListCreateAPIView:
建立和展現一個模型實例集合
提供get和post處理器
繼承於:GenericAPIView,ListModelMixin,CreateModelMixin
.RetrieveUpdateAPIView:
讀和改一個模型實例
提供get,put,patch處理器
繼承於:GenericAPIView,RetrieveModelMixin,UpdateModelMixin
.RetrieveDestoryAPIView:
讀和刪除一個模型實例
提供get和delete處理器
繼承於:GenericAPIView,RetrieveModelMixin,DestroyModelMixin
.RetrieveUpdateDestroyAPIView:
讀、改和刪一個模型實例
get, put, patch,delete處理器
繼承於:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
5、視圖集合ViewSets
Django REST框架容許您將一組相關的邏輯視圖在一個類,ViewSet類是一個簡單類型的基於類的觀點,沒有提供任何方法處理程序如.get()或. post(),
而代替提供方法好比.list()和create()。
一個小例子:框架
from django.contrib.auth.models import User from django.shortcuts import get_object_or_404 from myapps.serializers import UserSerializer from rest_framework import viewsets from rest_framework.response import Response class UserViewSet(viewsets.ViewSet): 「」」 A simple ViewSet for listing or retrieving users. 「」」 def list(self, request): queryset = User.objects.all() serializer = UserSerializer(queryset, many=True) return Response(serializer.data) def retrieve(self, request, pk=None): queryset = User.objects.all() user = get_object_or_404(queryset, pk=pk) serializer = UserSerializer(user) return Response(serializer.data)
1)關於ViewSets
若是咱們須要,咱們須要爲兩個GET請求分開綁定視圖:
user_list = UserViewSet.as_view({「GET」:’list’})
user_detail = UserViewSet.as_view({‘GET’:’retrieve’})
可是一般咱們不會這樣作,而是經過註冊路由來配置url:
from myapp.views import UserViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r’users’, UserViewSet) urlpatterns = router.urls
或許你會常常用到本身模型數據,而不是手動寫視圖集合,這樣就要用到模型視圖集合ModelViewSet:
class UserViewSet(viewsets.ModelViewSet): 「」」 A viewset for viewing and editing user instance 「」」 serializer_class = UserSerializer queryset = User.objects.all()
其餘路由函數方法:
class UserViewSet(viewsets.ViewSet): 「」」 Example empty viewset demonstrating the standard actions that will be handled by a router class. If you’re using format suffixes, make sure to also include the format=None keyword argument for each action. 「」」 def list(self, request): pass def create(self, request): pass def retrieve(self, request, pk=None): pass def update(self, request, pk=None): pass def partial_update(self, request, pk=None): pass def destroy(self, request, pk=None): pass 若是你有特別的須要被路由到的方法,能夠將它們標記爲須要路由使用@detail_route或@list_route修飾符。 @detail_route(methods=[‘post’], permission_classes=[IsAdminOrIsSelf]) def set_password(self, request, pk=None): … 能夠經過訪問^users/{pk}/set_password/$來訪問改視圖
2)ViewSets的API參考
.ViewSet:
繼承了APIView,你可使用一些標準的屬性例如permission_class,authentication_classes去對視圖作一些策略。ViewSet一樣不提供具體
行爲方法的實現,你能夠重寫和定義一些請求處理方法。而代替了原來APIVIew的POST,GET等方法,取而代之的是list,create等方法。
.GenericViewSet:
繼承了GenericAPIView,提供了默認的get_queryset()和get_object()等方法來獲取model數據,但不提供任何請求處理方法。
.ModelViewSet:
繼承了GenericAPIView,增長了一些請求處理方法,如list(), retrieve(),create()等。
例子:
class AccountViewSet(viewsets.ModelViewSet): 「」」 A simple ViewSet for viewing and editing accounts 「」」 queryset = Account.objects.all() serializer_class = AccountSerializer permissions_classes = [IsAccountAdminOrReadOnly]
.ReadOnlyModelViewSet:
繼承了GenericAPIView,只增長了只讀的請求處理方法list()和retrieve()
自定義View類:
只須要繼承GenericAPIView, 增長mixins的相關處理方法。如:
class CreatListRetrieveViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, View.GenericViewSet): pass
6、路由(routers)
一、REST框架還支持自動Django URL路由,併爲您提供了一個簡單的、快速的和一致的方式鏈接視圖邏輯的URL。
若是設置basename將自動生成基於queryset viewset的屬性,若是它有一個。注意,若是viewset不包括queryset屬性而後註冊時必須設置base_name viewset。
from rest_framework import routers router = routers.SimpleRouter() router.register(r’users’, UserViewSet, ‘users’) router.register(r’accounts’, AccountViewSet) urlpatterns = router.urls 注意:router.register有三個參數屬性: *prefix:這是url匹配正則表達式。 *viewset: 指定視圖集合 *base_name: 基於基礎的url名字設置。這個特別要注意,若是不加這個參數,那麼視圖集合必需要包含queryset這個屬性。
二、使用路由routers
router = routers.SimpleRouter() router.register(r’users’, UserViewSet) urlpatterns = [ url(r’^api/’, include(router.urls, namespace=’api’)), ] 或者:urlpatterns +=router.urls
三、@detail_route / @list_route指定路由
@detail_route(methods=[‘post’], permission_classes=[IsAdminOrIsSelf])
->指定post方法,權限爲IsAdminOrIsSelf
7、解釋器(parse)
一、設置解釋器
設置成全局:
REST_FRAMEWORK ={
‘DEFAULT_PARSER_CLASSES’: (‘rest_framework.parsers.JSONParser’,)
}
也能夠在視圖APIView中設置:
from rest_framework.parsers import JSONParser parser_class = (JSONParser,)
若是是@api_view裝飾的視圖:
@api_view([‘POST’])
@parser_classes((JSONParser,))
二、API 參考
JSONParse: application/json
FormParse: application/x-www-form-urlencoded
MultiPartParser: multipart/form-data
FileUploadParser: */*
–>file_obj = request.data[‘file’]
8、渲染器(renders)
一、設置渲染器
設置成全局:
REST_FRAMEWORK ={
‘rest_framework.renderers.JSONRenderer’,
‘rest_framework.renderers.BrowsableAPIRenderer’,
}
也能夠在視圖APIView中設置:
from rest_framework.renderers import JSONRenderer renderer_classes = (JSONRenderer, ) 若是是@api_view裝飾的視圖: @api_view([‘GET’]) @renderer_classes((JSONRenderer,))
9、序列化器serializers
序列化器能夠將python的複雜數據格式渲染成json,xml等格式,同時也提供了反序列化器,能夠將渲染成的數據解釋成python的數據模型對象。它和django中
的from表單用法很類似。
一、渲染序列化對象:
能夠將對象序列化成json,xml格式等
serializer = CommentSerializer(comment) serializer.data # {’email’: ‘leila@example.com’, ‘content’: ‘foo bar’, ‘created’: ‘2016-01-27T15:17:10.375877′} json = JSONRenderer().render(serializer.data) # 渲染成json格式 # b'{「email」:」leila@example.com」,」content」:」foo bar」,」created」:」2016-01-27T15:17:10.375877″}’
二、反序列化
from django.utils.six import BytesIO from rest_framework.parsers import JSONParser stream = BytesIO(json) data = JSONParser().parse(stream) # 解析json格式 serializer.is_valid() # True serializer.validated_data
三、保存實例
能夠利用.create()和.update()方法
調用.save()方法會執行上面兩個方法,自動保存或者更新實例對象
有時候,須要保存其餘的信息,能夠在參數中添加,如:
serializer.save(owner=request.user)
四、驗證validation
當須要保存反序列化的數據時,咱們每每須要在以前用is_valid()驗證數據的合法性,若是不合法能夠用
serializer.errors獲得該錯誤信息。這個錯誤信息能夠根據error_message來進行自定義
五、模型序列化ModelSerializer
模型序列化與字段序列化用法相似,只需在類的屬性Meta中指定相應的模型,就會根據模型自動生成相應的字段
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = (‘id’, ‘account_name’, ‘users’, ‘created’)
六、超連接模型序列化HyperlinkedModelSerializer
與模型序列化相似,只不過過了一個可連接的形式。
10、序列化字段serializer fields
一、核心參數
*read_only: 只讀形式,只能序列化到api輸出,不能被反序列化數據更新修改操做。默認False
*wirte_only: 只寫形式,只能被反序列化數據更新和建立,不能序列化表示。默認False
*required: 必須字段,一般出如今反序列化的過程當中,該字段必須有值。默認True
*allow_null:是否容許爲空,默認False
*default: 默認值,
*source:字段來源,爲字段指定一個字段來源,如(source=’user.email’).
*validators: 合法性函數列表,支持django的ValidationError包。
*error_message: 一個錯誤信息的字典,包含null, blank, invalid, invalid_choice, unique等鍵值。
*label:一篇簡短的文本字符串,能夠用做在HTML表單字段的名稱或其餘描述性的元素
*help_text: 一個文本字符串,能夠用做描述字段的HTML表單字段或其餘描述性的元素。
*initial: 用於預先填充HTML表單字段的值。
*style: 字典的鍵-值對,能夠用來控制渲染器應該如何呈現。
二、字段類型
*布爾字段BooleanField: BoolenField(defalut=True)
*字符字段StringField: CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
*郵箱字段EmailField: EmailField(max_length=None, min_length=None, allow_blank=False)
*正則字段RegexField: RegexField(regex, max_length=None, min_length=None, allow_blank=False)
*新聞標題字段SlugField:SlugField(max_length=50, min_length=None, allow_blank=False)
*URL地址字段 UrlField: URLField(max_length=200, min_length=None, allow_blank=False)
*UUID字段 UUIDField: UUIDField(format=’hex_verbose’) —「de305d54-75b4-431b-adb2-eb6b9e546013″
*文件路徑字段FilePathField:FilePathField(path, match=None, recursive=False, allow_files=True, allow_folders=False, required=None, **kwargs)
*IP地址字段IPAddressField:IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
*數字型字段:IntegerField、FloatField、DecimalField
*時間和日期字段:DateTimeField:DateTimeField(format=None, input_formats=None)
DateField:
TimeField:
DurationField:
*選擇字段:ChoiceField
*文件字段:FileField:FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField:ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
*模型字段:ModelField:ModelField(model_field=<Django ModelField instance>)
*只讀字段:ReadOnlyField:
11、字段關係serializer relations
多對一:ForeignKey
多對多: ManyToManyField
一對一:OneToOneField
一、api參考
tracks = serializers.StringRelatedField(many=True) # 字符串形式關係字段
tracks = serializers.PrimaryKeyRelatedField(many=True, read_only=True)# 主鍵形式關係字段
tracks = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name=’track-detail’) # 超連接形式關係字段
tracks = serializers.SlugRelatedField(many=True, read_only=True, slug_field=’title’) # 以小標題形式關係
track_listing = serializers.HyperlinkedIdentityField(view_name=’track-list’) # 超連接身份關係
二、嵌套關係
序列化類中能夠直接引用其餘序列化化類
12、合法性驗證(Validation)
一、數據的惟一性UniqueValidator
在模型中,只需設置字段的unique=True就會在該字段自動生成改惟一性判斷
例:slug = SlugField(max_length=100, validators=[UniqueValidator(queryset=BlogPost.objects.all(), messsage=」)])
*queryset:模型數據對象集合
*message: 異常提示信息
二、數據字段的不重複性UniqueTogetherValidator
class Meta: validators = [ UniqueTogetherValidator( queryset=ToDoItem.objects.all(), fields=(‘list’, ‘position’) ) ] *queryset:模型數據對象集合 *fields: 字段的集合元祖 *message: 異常提示信息
十3、認證Authentication
一、設置認證方案
*能夠在settings文件中配置DEFAULT_AUTHENTICATION_CLASSES:
REST_FRAMEWORK = {
‘DEFAULT_AUTHENTICATION_CLASSES’: (
‘rest_framework.authentication.BasicAuthentication’,
‘rest_framework.authentication.SessionAuthentication’,
)
}
*也能夠在視圖中設置
(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication) permission_classes = (IsAuthenticated,) (@api_view) @authentication_classes((SessionAuthentication, BasicAuthentication)) @permission_classes((IsAuthenticated,))
十4、權限
一、設置權限方案
*能夠在settings文件中配置DEFAULT_PERMISSION_CLASSES
REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’, # ‘rest_framework.permissions.AllowAny’, ) }
*視圖中設置:
(APIView)
permission_classes = (IsAuthenticated,)
(@api_view)
@permission_classes((IsAuthenticated, ))
二、API引用
*AllowAny:容許任何
*IsAuthenticated:是否被認證
*IsAdminUser:是管理用戶
*IsAuthenticatedOrReadOnly:是被認證或者只讀
*DjangoModelPermissions:標準的django模型設置權限
*DjangoModelPermissionsOrAnonReadOnly:標準的django模型處理或者只讀權限
*DjangoObjectPermissions:相比模型權限,只提供queryset和get_queryset方法。
*自定義權限:
繼承BasePermission;
重寫:.has_permission(self, request, view)
.has_object_permission(self, request, view, obj)
十5、節流Trottling
限制請求量
一、設置節流方案
*能夠在settings文件中配置DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES
‘DEFAULT_THROTTLE_CLASSES’: ( ‘rest_framework.throttling.AnonRateThrottle’, ‘rest_framework.throttling.UserRateThrottle’ ), ‘DEFAULT_THROTTLE_RATES’: { ‘anon’: ‘100/day’, ‘user’: ‘1000/day’ }
*能夠在視圖中設置:
(APIView)
throttle_classes = (UserRateThrottle,)
(@api_view)
@throttle_classes([UserRateThrottle])
十6、過濾器Filtering
一般drf的默認的通用list視圖類要處理的是所有模型的查詢集合集,若是咱們要指定結果集,
這就必須用到過濾器了。一般的方法是重寫get_queryset(self)方法。
例如:
# 根據用戶過濾
class PurchaseList(generics.ListAPIView): serializer_class = PurchaseSerializer def get_queryset(self): user = self.request.user return Purchase.objects.filter(purchase = user) # 根據url請求過濾 def get_queryset(self): username = self.kwargs[‘username’] return Purchase.objects.filter(purchaser__username=username) # 根據請求參數過濾同上 def get_queryset(self): queryset = Purchase.objects.all() username = self.request.query_params.get(‘username’, None) if username is not None: queryset = queryset.filter(purchaser__username=username) return queryset
一、generic filter過濾
*經過settings文件中配置過濾
REST_FRAMEWORK = {
‘DEFAULT_FILTER_BACKENDS’: (‘rest_framework.filters.DjangoFilterBackend’,)
}
*也可經過視圖中過濾
filter_backends = (filters.DjangoFilterBackend,)
二、API嚮導
*pip install django-filter
filter.DjangoFilterBackend
*filter_fields過濾字段
class ProductList(generics.ListAPIView): query = Product.object.all() serializer_class = ProductSerializer filter_backends = (filter.DjangoFilterBackend,) filter_fields = (‘category’, ‘in_stock’) http://example.com/api/products?category=clothing&in_stock=True *filter_class指定一個過濾集合類 import django_filters from myapp.models import Product from myapp.serializers impoert ProductSerializer from rest_framework import filters from rest_framework import generics class ProductFilter(filters.FilterSet): min_price = django_filters.NumberFilter(name=’price’, lookup_type=」gte」) max_price = django_filters.NumberFilter(name=’price’, lookup_type=」lte」) class Meta: model = Product fields = [‘category’, ‘in_stock’, ‘min_price’, ‘max_price’] class ProductList(generics.ListAPIView): queryset = Product.object.all() serializer_class = ProductSerializer filter_backends = (filter.DjangoFilterBackend,) filter_class = ProductFilter http://example.com/api/products?category=clothing&max_price=10.00 同理雙下劃線強調名字: class ProductFilter(filters.FilterSet): class Meta: model = Product fields = [‘category’, ‘in_stock’, ‘manufacturer__name’] http://example.com/api/products?manufacturer__name=foo 上面例子等同於: class ProductFilter(filter.FilterSet): manufacturer = django_filters.CharFilter(name=」manufacter__name」) class Meta: model = Product fields = [‘category’, ‘in_stock’, ‘manufacturer’] http://example.com/api/products?manufacturer=foo *search_fields 搜索字段 class UserListView(generics.ListAPIView): queryset = User.object.all() serializer = UserSerializer filter_backends = (filter.SearchFilter,) filter_fields = (「suername」, ’email’) http://example.com/api/users?search=russell *ordring_fields排序字段 class UserList(generics.ListAPIView): queryset = User.object.all() serializer_class = UserSerializer filter_backends = (filter.OrderingFilter,) filter_fields = ‘__all__’ ordering = (‘username’,) # 默認排序字段 *DjangoOjectPermissionFilter 對象權限的過濾器 filter_backends = (filter.DjangoObjectPermissionFilter,) permission_classes = (myapp.permissions.CustomObjectPermissions,) # 自定義的權限類
十7、分頁Pagination
一、設置分頁
*能夠在settings中設置分頁樣式
REST_FRAMEWORK = {
‘DEFAULT_PAGINATION_CLASS’: ‘rest_framework.pagination.LimitOffsetPagination’
}
*修改分頁樣式
class LargeResultsSetPagination(PageNumberPagination): page_size = 1000 page_size_query_param = ‘page_size’ max_page_size = 10000 class StandardResultsSetPagination(PageNumberPagination): page_size = 100 page_size_query_param = ‘page_size’ max_page_size = 1000
*應用到視圖中
class BillingRecordsView(generics.ListAPIView): queryset = Billing.objects.all() serializer = BillingRecordsSerializer pagination_class = LargeResultsSetPagination
2) API引用
*PageNumberPagination
設置全局的分頁大小:
REST_FRAMEWORK = { ‘DEFAULT_PAGINATION_CLASS’: ‘rest_framework.pagination.PageNumberPagination’, ‘PAGE_SIZE’: 100 }