1. 程式人生 > 其它 >過濾和排序

過濾和排序

目錄

過濾元件

對於列表資料可能需要根據欄位進行過濾,我們可以通過新增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欄位降序排序