django: rest-framework的 分頁和過濾
阿新 • • 發佈:2018-12-05
category box nic 模糊 sta result pro -h nbsp
django: rest-framework的 分頁和過濾
2018年06月28日 10:09:01 weixin_42359464 閱讀數:136 個人分類: pythonflaskresetframeworkdjango 版權聲明:尊重版權, 從你做起 https://blog.csdn.net/weixin_42359464/article/details/80838997http://blog.wktadmin.com
一. 分頁
二. 過濾
一. 分頁
rest-framework查詢時候默認是不分頁的, 除了手動計算查詢的起始位置之外, rest-framework也提供了一些頁碼的設置功能.
- 方式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的 分頁和過濾