1. 程式人生 > >DRF中介面資料序列化及分頁、過濾、搜尋、排序的快速實現

DRF中介面資料序列化及分頁、過濾、搜尋、排序的快速實現

       在學習了一段時間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官方文件