版权声明:如有转载复制请注明出处,博主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官方文档