過濾和排序
阿新 • • 發佈:2022-12-12
目錄
過濾元件
對於列表資料可能需要根據欄位進行過濾,我們可以通過新增django-filter擴充套件來增強支援
pip install django-filter
在配置檔案中新增過濾後端的設定
INSTALLED_APPS=[
'django_filter',#需要註冊應用
]
#全域性配置,也可以區域性配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}
在檢視類中新增 filterset_fields類屬性,指定可以過濾的欄位
from rest_framework.generics import ListAPIView from app01.models import Book from django_filters.rest_framework import DjangoFilterBackend class BookView(ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [DjangoFilterBackend] # 在檢視中加上該類,就可以 filterset_fields = ('name','price') #配置按照哪個欄位來過濾 #http://127.0.0.1:8000/books/?price=40 #http://127.0.0.1:8000/books/?name=活著
排序元件
在類檢視中設定filter_backends
屬性,使用rest_framework.filters.OrderingFilter
過濾器,DRF會在請求的查詢字串引數中檢查是否包含了ordering引數,如果包含了ordering引數,則按照ordering引數指明的排序欄位對資料集進行排序後展示。
from rest_framework.generics import ListAPIView from rest_framework.filters import OrderingFilter from app01.models import Book from app01.serializer import BookSerializer # # 排序元件使用 class Book2View(ListAPIView): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = [OrderingFilter] ordering_fields = ('id' ,'price',) # # 指明按照'id'和'price'欄位的值的大小對資料進行排序後展示 #urls.py path('books2/', views.Book2View.as_view()), #必須是ordering = 某個值 #http://127.0.0.1:8000/books2/?ordering=price # 127.0.0.1:8000/books2/?ordering=-id # -id 表示針對id欄位進行倒序排序 # id 表示針對id欄位進行升序排序
根據id
降序排序
如果需要過濾後在排序,則選喲過濾和排序兩者結合使用
from rest_framework.generics import ListAPIView
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from app01.models import Book
from app01.serializer import BookSerializer
#views.py
class Book3View(ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# 因為'filter_backends'是區域性過濾配置,區域性配置會覆蓋'settinigs.py'檔案中的全域性配置,所以需要再次宣告過濾元件核心類'DjangoFilterBackend',否則過濾功能會失效
filter_backends = [DjangoFilterBackend, OrderingFilter] # 在檢視中加上該類,就可以
filterset_fields = ('name', 'price')
ordering_fields = ('id', 'price',)
#urls.py
path('books3/', views.Book3View.as_view()),
#http://127.0.0.1:8000/books3/?price=66&ordering=-id
#先過濾出價格為66的,再根據id欄位降序排序