1. 程式人生 > >django: rest-framework的 分頁和過濾

django: rest-framework的 分頁和過濾

category box nic 模糊 sta result pro -h nbsp

django: rest-framework的 分頁和過濾

2018年06月28日 10:09:01 weixin_42359464 閱讀數:136 標簽: flaskrestframeworkdjango 個人分類: pythonflaskresetframeworkdjango 版權聲明:尊重版權, 從你做起 https://blog.csdn.net/weixin_42359464/article/details/80838997

http://blog.wktadmin.com

一. 分頁

二. 過濾


一. 分頁

rest-framework查詢時候默認是不分頁的, 除了手動計算查詢的起始位置之外, rest-framework也提供了一些頁碼的設置功能.

  1. 方式1: 直接在setting裏添加配置

在settings中rfw(rest-framework)的所有設置都在REST_FRAMEWORK字典中,(如果不設置將采用rfw的默認設置, 默認設置存放在rest-framework.settings中, 可以在此處查詢設置的字段名, 防止拼寫錯誤), 我們修改項目目錄下的settings.py

REST_FRAMEWORK = {
    ‘DEFAULT_PAGINATION_CLASS‘: ‘rest_framework.pagination.LimitOffsetPagination‘,
    ‘PAGE_SIZE‘: 10  # 這是每頁顯示的數目
}
  • 1
  • 2
  • 3
  • 4

完畢
此時通過restframe查詢之時, 將以每頁十條數據顯示. 這種方式及其簡單, 但是無法對url的頁碼參數進行’個性化’定制

  • 方式2: 自定義分頁(類):

自定義類需要重寫PageNumberPagination, 可以自定義多個參數

from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = ‘size‘
    page_query_param = ‘p‘
    max_page_size = 100
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

重寫後只需在類視圖中指定即可


class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    goods list   
    """
    ...
    pagination_class = StandardResultsSetPagination
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

此時的url變為:

http://localhost:8000/books/?p=3&size=3
  • 1

二. 過濾

  • 方式1: 簡單設置

直接在視圖指定filter_backends可以快速實現過濾的功能

from django_filters.rest_framework import DjangoFilterBackend
class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    goods list   
    """
    ...
    filter_backends = (DjangoFilterBackend, )  # 過濾
     filter_fields = (‘name‘, ‘shop_price‘)   # 過濾的字段
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

此時通過瀏覽器訪問, 右上角誰多出一個過濾器按鈕, 點擊即可過濾:

技術分享圖片

但是值得註意的是, 這種過濾方式不支持任何模糊搜索的, 必須完全一致才可以匹配到結果.
過濾時的url格式為

http://localhost:8000/books/?name=namss&shop_price=30
  • 1
  • 方式2: 自定義過濾器類

為了實現模糊搜索, 可以設置一個自定義的過濾器類, 並在視圖中完成指定.
比如過濾價格區間:

import django_filters
from .models import Goods
class ProductFilter(django_filters.rest_framework.FilterSet):
    ‘‘‘商品的過濾類‘‘‘
    # 比如此處我們進行價格的過濾
    price_min = django_filters.NumberFilter(name="shop_price", lookup_expr=‘gte‘)
    price_max = django_filters.NumberFilter(name="shop_price", lookup_expr=‘lt‘)

    class Meta:
        model = Goods
        fields = [‘price_min‘, ‘price_max‘]  # 使之生效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

當然, 也需要到視圖中指定filter_class

from django_filters.rest_framework import DjangoFilterBackend
class GoodsListView(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    goods list   
    """
    ...
    filter_backends = (DjangoFilterBackend, )  # 過濾
    # 自定義的過濾
    filter_class = ProductFilter
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

技術分享圖片

django: rest-framework的 分頁和過濾