drf過濾元件

2022-08-16 10:36:12 字數 4044 閱讀 2850

主要包含分頁,搜尋,排序,分類,區間

系統基礎分頁器

from rest_framework import pagination

class freecourselistviewset(listmodelmixin,genericviewset):

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

serializer_class = serializers.coursemodelserializer

pagination_class = pagination.pagenumberpagination

pagination.pagenumberpagination.page_size = 2

自定義基礎分頁器

views.py

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

paginations.py

from rest_framework import pagination

class pagenumberpagination(pagination.pagenumberpagination):

page_size = 2 #使用者配置每頁顯示幾條資料

page_query_param = 'page' #查詢頁面的關鍵字 eg page =1 第一頁

page_size_query_param = 'page_size' #使用者配置每頁幾條資料

max_page_size = 3 #最多可以顯示幾條資料

指定偏移幾個資料,後面的幾個資料展示

自定義偏移分頁器

views.py

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.limitoffsetpagination

paginations.py

class limitoffsetpagination(pagination.limitoffsetpagination):

# 預設一頁顯示的條數

default_limit = 2

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

limit_query_param = 'limit'

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

offset_query_param = 'offset'

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

max_limit = 10

介面使用分頁器前後的response的格式不一樣

分頁前:資料在response.data中

分頁後:資料在response.data.results中

過濾類(包括searchfilter,和orderingfilter)有filter_queryset(self, request, queryset, view)方法,返回queryset物件.

首先配置過濾器類

filter_backends = [searchfilter, orderingfilter, djangofilterbackend]
searchfilter元件

配置搜尋字段

filter_backends = [searchfilter]

search_fields = ['name', 'brief']#欄位必須都是資料庫表字段

前端介面

介面:/?search=搜尋關鍵字
orderingfilter元件

配置排序字段

filter_backends = [orderingfilter]

ordering_fields = ['price', 'id', 'students'] #欄位必須都是資料庫表字段

前端介面

?ordering=price 按**公升序

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

drf自帶的元件無法完成分類和區間,需要借助django-filter模組

安裝

pip install django-filter
配置

# django-filter外掛程式的djangofilterbackend元件:

from django_filters.rest_framework import djangofilterbackend

# 第一種配置,配置字段:

filter_fields = ['course_category']

# 第二個配置,配置類

filter_class = coursefilterset

filters.py中

from django_filters.filterset import filterset

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']

filter_backends = [myfilter]
filters.py

# 自定義過濾器:自定義普通類,實現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 # 沒過濾

DRF過濾元件

from rest framework import pagination 基礎分頁 class pagenumberpagination pagination.pagenumberpagination 預設一頁顯示的條數 page size 2 查詢頁面的關鍵字 page query param ...

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...