DRF的過濾與排序


  • 過濾

對於列表數據可能需要根據字段進行過濾,我們可以通過添加 django-filter 擴展來增強支持。

pip install django-filter

在配置文件中增加過濾后端的設置:

INSTALLED_APPS = [
    ...
    'django_filters', # 需要注冊應用, ]

 

  • 全局配置

在settings文件中配置:

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)  # 全局配置,對全部視圖的查詢多條接口都有過濾功能,但是視圖里要指定字段
}

視圖中指定要過濾的字段:

class EmployeeViewSet(ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer
    # 指定可以根據哪些字段進行列表數據的過濾
    filter_fields = ('gender', 'department')

 

  • 針對某個視圖進行過濾(比較常用)

class EmployeeViewSet(ModelViewSet):
    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer

    # 指定過濾器
    filter_backends = [DjangoFilterBackend]
    # 指定可以根據哪些字段進行列表數據的過濾
    filterset_fields = ('gender', 'department')

 

  • 使用

訪問127.0.0.1/employees?gender=1時可以過濾出性別字段是1的數據。

===================================================================================================================================

  • 排序

對於列表數據,REST framework 提供了 OrderingFilter 過濾器 來實現按指定字段進行排序的功能

使用方法:

  • 在類視圖中設置filter_backends,使用 rest_framework.filters.OrderingFilter(自帶的模塊,導包時注意) 過濾器:REST framework會在請求的查詢字符串參數中檢查是否包含了 ordering 參數,如果包含,則按照 ordering 參數指定的字段對數據集進行排序。
  • 在類視圖中指定 ordering_fields屬性,表示前端請求列表數據時,可以通過哪些字段進行排序

 

設置示例:

class EmployeeViewSet(ModelViewSet):

    queryset = Employee.objects.all()
    serializer_class = EmployeeSerializer

    # 新增排序的過濾器
    filter_backends = [..., OrderingFilter]
    # 指定可以根據哪此字段進行排序
    ordering_fields = ('age', 'salary')

 

使用示例:

訪問127.0.0.1/employees/?ordering=age(年齡升序)

訪問127.0.0.1/employees/?ordering=-age(年齡降序)

訪問127.0.0.1/employees/?ordering=age,-salary(先安裝年齡升序來排,如果年齡一樣,按工資升序來排)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM