DRF中接口数据序列化及分页、过滤、搜索、排序的快速实现

版权声明:如有转载复制请注明出处,博主QQ715608270,欢迎沟通交流! https://blog.csdn.net/qq_41000891/article/details/84452278

       在学习了一段时间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官方文档

猜你喜欢

转载自blog.csdn.net/qq_41000891/article/details/84452278