DRF過濾元件

2022-06-28 15:51:14 字數 4207 閱讀 8777

from rest_framework import pagination

# 基礎分頁

class pagenumberpagination(pagination.pagenumberpagination):

# 預設一頁顯示的條數

page_size = 2

# 查詢頁面的關鍵字

page_query_param = 'page'

# 使用者自定義一頁顯示條數的關鍵字

page_size_query_param = 'page_size'

# 使用者最大可自定義一頁顯示的條數

max_page_size = 2

class limitoffsetpagination(pagination.limitoffsetpagination):

# 預設一頁顯示的條數

default_limit = 2

# 使用者自定義一頁顯示的條數

limit_query_param = 'limit'

# 使用者自定義偏移的條數

offset_query_param = 'offset'

# 使用者最大可自定義一頁顯示的條數

max_limit = 2

from . import paginations

class freecourselistviewset(listmodelmixin, genericviewset):

queryset = models.course.objects.filter(is_delete=false, is_show=true).all()

serializer_class = serializers.coursemodelserializer

# 配置某乙個分頁類即可

pagination_class = paginations.pagenumberpagination

# 注:介面分頁前後,response的格式不一樣

# 分頁前:資料是response.data

# 分頁後:資料是response.data.results

群查介面的檢視類:views.py

from rest_framework.filters import searchfilter

class freecourselistviewset(listmodelmixin, genericviewset):

queryset = models.course.objects.filter(is_delete=false, is_show=true).all()

serializer_class = serializers.coursemodelserializer

# 配置搜尋元件

filter_backends = [searchfilter]

# 配置參與搜尋字段

search_fields = ['name', 'brief']

# 規則:

# 參與全文搜尋的字段為name和brief(兩個字段必須都是資料庫表字段)

# 介面:?search=搜尋關鍵字,會全文匹配name和brief兩個字段

群查介面的檢視類:views.py

from rest_framework.filters import orderingfilter

class freecourselistviewset(listmodelmixin, genericviewset):

queryset = models.course.objects.filter(is_delete=false, is_show=true).all()

serializer_class = serializers.coursemodelserializer

# 配置排序元件

filter_backends = [orderingfilter]

# 配置參與排序字段

ordering_fields = ['price', 'id', 'students']

# 規則:

# ?ordering=price 按**公升序

# ?ordering=-price 按**降序

# ?ordering=id 按主鍵公升序

# ?ordering=-price,id 按**降序,**相同時按主鍵公升序

# 自定義過濾器:自定義普通類,實現filter_queryset可以接受request, queryset, view返回過濾處理後的queryset即可

class myfilter:

def filter_queryset(self, request, queryset, view):

# 過濾條件是死的,?count=數字,也可以寫高階一點,從view中去反射配置資訊,或者將配置資訊放在settings中

count = request.query_params.get('count', none)

if not count:

return queryset # 沒過濾

try:

count = int(count)

return queryset[:count] # 過濾

except:

return queryset # 沒過濾

from .filters import myfilter

class freecourselistviewset(listmodelmixin, genericviewset):

queryset = models.course.objects.filter(is_delete=false, is_show=true).all()

serializer_class = serializers.coursemodelserializer

# 配置排序元件

filter_backends = [myfilter]

安裝django-filter外掛程式

>: pip install django-filter
from django_filters import filters

from . import models

class coursefilterset(filterset):

# 實現區間:field_name關聯model表屬性,lookup_expr設定過濾規則

min_price = filters.numberfilter(field_name='price', lookup_expr='gte')

max_price = filters.numberfilter(field_name='price', lookup_expr='lte')

class meta:

model = models.course

# min_price 和 max_price 自定義規則字段可以不在fields中配置

fields = ['course_category']

from django_filters.rest_framework import djangofilterbackend

from .filters import coursefilterset

class freecourselistviewset(listmodelmixin, genericviewset):

queryset = models.course.objects.filter(is_delete=false, is_show=true).all()

serializer_class = serializers.coursemodelserializer

# 配置過濾元件

filter_backends = [djangofilterbackend]

# 配置過濾規則的類

filter_class = coursefilterset

# 規則:

# ?course_category=1 課程分組1所有的課程

# ?min_price=10 課程**大於等於10的所有課程

# ?min_price=10&max_price=100 課程**大於等於10小於等於100的所有課程

drf過濾元件

主要包含分頁,搜尋,排序,分類,區間 系統基礎分頁器from rest framework import pagination class freecourselistviewset listmodelmixin,genericviewset queryset models.course.objec...

drf 分頁元件

目錄可以達到檢視第幾頁以及每一頁顯示幾條的效果 from rest framework.pagination import pagenumberpagination 一 基本使用 url url 無效 class pager apiview def get self,request,args,kwa...

drf 許可權元件

目錄許可權就是某些功能只對特定的使用者開放,比如django中建立使用者可分為超級使用者和普通使用者,此時超級使用者就有許可權進入後台管理系統,而普通使用者就沒有許可權,這是怎麼做到的呢?這就是許可權元件的作用。from rest framework.permissions import basep...