DRF中介面資料序列化及分頁、過濾、搜尋、排序的快速實現
阿新 • • 發佈:2018-11-27
在學習了一段時間DRF後,明顯感受到了在Web API搭建的過程中,DRF比Django靈活和迅速很多,DRF中提供了很多強大檢視和API,本篇通過一個商品頁的小案例記錄一下通過試用各種檢視及filter之後總結出的一套最簡化程式碼。
在這套程式碼中,採用了serializer和filter檔案與view分離的形式,但都屬於一個app資料夾:
1.serializer.py檔案
#!/usr/bin/env python # encoding: utf-8 ''' @author: ZhonghangAlex @contact:
[email protected] @software: pycharm @file: serializers.py @time: 2018/11/15 15:35 @desc: ''' from rest_framework import serializers from goods.models import Goods, GoodsCategory # 通過Modelserializer進行序列化操作 class CategorySerilizer(serializers.ModelSerializer): class Meta: model = GoodsCategory fields = "__all__" class GoodsSerializer(serializers.ModelSerializer): #實現資料巢狀 category = CategorySerilizer() class Meta: model = Goods fields = "__all__"
2.filters.py檔案
#!/usr/bin/env python # encoding: utf-8 ''' @author: ZhonghangAlex @contact: [email protected] @software: pycharm @file: filters.py @time: 2018/11/24 19:08 @desc: ''' # 自定義filters以傳統filters為基礎所以需要引入 import django_filters from django_filters import rest_framework as filters from .models import Goods class GoodsFilter(filters.FilterSet): """ 商品的過濾類 """ price_min = django_filters.NumberFilter(field_name='shop_price', lookup_expr='gte')# 名稱空間+操作 price_max = django_filters.NumberFilter(field_name='shop_price', lookup_expr='lte')# 名稱空間+操作 name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')# 字串模糊查詢,不加操作預設全部匹配 class Meta: model = Goods fields = ['price_min', 'price_max', 'name']
3.view.py檔案
from django.shortcuts import render
from .serializers import GoodsSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import mixins
from rest_framework import generics
from rest_framework import filters # 此處為drf自帶的filter
from rest_framework.pagination import PageNumberPagination
from rest_framework import viewsets
# 傳統django過濾的引入,沒有模糊過濾功能
from django_filters.rest_framework import DjangoFilterBackend # 此處為原始基本的filter
from .models import Goods
from .filters import GoodsFilter # 此處為外部定義的filter檔案
# Create your views here.
# 定製化page
class StandardGoodsPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
page_query_param = "p" #url引數
max_page_size = 1000
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表頁:分頁,過濾,搜尋,排序
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = StandardGoodsPagination
# 應用django_filter的過濾
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) # django_filter是建立在傳統filter之上的
filter_class = GoodsFilter
# 應用search
search_fields = ('name', 'goods_brief', 'goods_desc') # 此處可以新增正則表示式寫法,具體寫法見官方API
# 應用排序
ordering_fields = ('sold_num', 'add_time')
4.構建的API效果
通過DRF我們可以構建一個完美的API,不需要藉助任何API工具,就可以實現資料的完美視覺化,而且具有測試互動功能。
這些我們使用DRF都是可以自動生成的。
本篇只做程式碼和效果記錄,不做過多解釋,詳細請看DRF官方文件