过滤功能利用的是第三方包 django_filters,搜索和排序利用的是 Django DRF 提供的 filters

示例代码如下:

from rest_framework import filters # 搜索和排序功能 # 注意:这两个是 DRF 提供的功能

from django_filters.rest_framework import DjangoFilterBackend  # DjangoFilterBackend 是精确(查找)过滤,即 字段值必须要完全一样才能匹配成功
import django_filters class GoodsFilter(django_filters.rest_framework.FilterSet):
"""商品的过滤类"""
min_price = django_filters.NumberFilter(field_name="price",
lookup_expr="gte") # field_name 表示要过滤字段;lookup_expr 表示 过滤时要进行的操作,gte 表示 大于等于
max_price = django_filters.NumberFilter(field_name="price", lookup_expr="lte") # lte 小于等于
name = django_filters.CharFilter(field_name="name",lookup_expr="icontains") # icontains 表示 包含(忽略大小写) class Meta:
model = models.Goods # 关联的表
fields = ["min_price","max_price","name"] # 过滤的字段 class GoodsPagination(PageNumberPagination):
page_size = 10
page_size_query_param = "page_size"
page_query_param = "p"
max_page_size = 100 class GoodsListViewSet(mixins.ListModelMixin,GenericViewSet):
"""商品查看"""
queryset = models.Goods.objects.all() # 没 get_queryset() 这个过滤方法时,需要写上这一步的 queryset;有 get_queryset 方法时,则不需要写这一步,因为会自动去 get_queryset() 中找 queryset
pagination_class = GoodsPagination # 方式三:自定义过滤功能(也包含搜索和排序功能)
filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter) # filters.SearchFilter 表示 搜索功能;filters.OrderingFilter 表示 排序功能
filterset_class = GoodsFilter # 把自定义的过滤类 GoodsFilter 赋值给 filterset_class
search_fields = ('^name', 'goods_brief') # 搜索功能对应的字段 # '^' Starts-with search;'=' Exact matches.
ordering_fields = ("sold_num","add_time") # 排序功能对应的字段 # 业务逻辑省略... """
# 过滤功能方式二
filter_backends = (DjangoFilterBackend,) # 过滤类型
filterset_fields = ("name","shop_price") # 过滤字段 # 这种的过滤只能满足精确过滤
""" """
# 方式一:get_queryset()方法
def get_queryset(self): # 过滤方法; GenericAPIView 提供的方法
queryset = models.Goods.objects.all()
price_min = self.request.query_params.get("price_min",0)
if price_min:
queryset = queryset.filter(shop_price_gt=int(price_min))
return queryset
""" """
方式二:通过 django-filter
# 1. pip install django-filter
# 2. 把 "django-filters" 添加到 Django 的 INSTALLED_APPS 中
# 3. 在 filter_backends 中添加 DjangoFilterBackend,在 filterset_fields 中添加 过滤字段
这个方式的过滤是精确过滤,即 用户传过来的值必须和 对应过滤字段的值完全一样才能过滤出来;
如果想自定义过滤功能(例如想过滤出价格区间),可通过方式三
""" """
方式三:通过 django-filter 自定义 过滤功能
1. 自定义一个过滤类
2. filter_backends = (DjangoFilterBackend,)
3. filterset_class = GoodsFilter # 把自定义的过滤类 GoodsFilter 赋值给 filterset_class
"""

django-filters 文档: https://django-filter.readthedocs.io/en/latest/guide/rest_framework.html

最新文章

  1. 简历生成平台项目开发-STEP1问卷设计
  2. C#调用windows API的一些方法
  3. C# 类型基础
  4. 让你的PHP更安全之PHP.ini
  5. CentOS 6.0 图形(图解)安装教程
  6. brewhome - 第三方包管理工具
  7. Ajax效果
  8. chart控件怎么使x轴标签全部显示出来
  9. Count Good Substrings
  10. Symfony2目录结构说明
  11. 切割图像(五)主动轮廓模型Snake简要模型
  12. 一张图让你快速学会UML(聚合、组合、依赖、继承、接口、类)
  13. SQL Server对比两字符串的相似度(函数算法)
  14. PM九步法
  15. js将字符串转换成json的三种方式
  16. 针对Xcode 9 + iOS11 的修改,及iPhone X的适配
  17. WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService
  18. RabbitMQ文档翻译——Hello World!(下)
  19. sentinel服务器出现大量的连接问题【转载】
  20. 20145324 Java实验二

热门文章

  1. 用.NetReactor保护您的源码[转][修改]
  2. 转 ORA-00054 的解决方法
  3. D. Winter Is Coming 贪心(好题)
  4. poj1781In Danger(约瑟夫) 问题
  5. 键盘工具栏的快速集成--IQKeyboardManager
  6. iOS-UI控件之UIButton
  7. 【VBA研究】如何用Base64 编解码方法实现简单的加解密
  8. laravel UserRequest $request error
  9. numpy调试
  10. Hibernate修改操作 删除操作 查询操作 增加操作 增删改查 Hibernate增删查改语句