Django DRF:过滤&搜索&排序功能

过滤功能利用的是第三方包 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.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
    """

原文地址:https://www.cnblogs.com/neozheng/p/9838440.html

时间: 2024-10-02 00:21:12

Django DRF:过滤&搜索&排序功能的相关文章

【Django REST framework】DRF快速编写接口(查询所有数据、分页、搜索、过滤、排序、新增单条数据)

所需依赖包及版本号 [packages]django = {index = "https://pypi.douban.com/simple",version = "==2.2.10"}djangorestframework = "==3.11.0"markdown = "==3.2.1"pygments = "==2.5.2"django-filter = "==2.2.0"django

Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/12684155 前段时间因为换工作的缘故又恰巧碰到国庆节,所以有段时间自己没有更新博客了,过完国庆到新公司报道,感觉还不错,就是现在住的地方离新公司有点远,地铁20站,伤不起啊,我每天早上7点多就要起床,然后屁颠屁颠的去挤地铁上班,晚上下班还要挤地铁,先不说路程远,车费一天就要10几块,我的银子啊,有坐龙华线去上班的深圳程序员不?听说那条线上班高峰期很挤?我没在上班高峰期坐过那趟车,我

[Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能

感谢eoe社区的分享 最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能,转帖来和eoe的小伙伴们一同分享下! Android 有关ListView实现A-Z字母排序和过滤搜索功能并且实现汉字转成拼音的功能 我们知道一般我们对联系人,城市列表等实现A-Z的排序,因为联系人和城市列表我们可以直接从数据库中获取他的汉字拼音,而对于一般的数据,我们怎么实现A

drf_jwt手动签发与校验-drf小组件:过滤-筛选-排序-分页

签发token 源码的入口:完成token签发的view类里面封装的方法. 源码中在请求token的时候只有post请求方法,主要分析一下源码中的post方法的实现. settings源码: 总结: 源码的入口 # 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口 # 1)rest_framework_jwt.views.ObtainJSONWebToken 的 父类 JSONWebTokenAPIView 的 post 方法 # 接受有usernam

Django中使用JS通过DataTable实现表格前端分页,每页显示页数,搜索等功能

版本: django:2.1.7 python:3.7 Django架构中自带了后端分页的技术,通过Paginator进行分页,前端点击按钮提交后台进行页面切换. 优缺点:后端分页对于数据量大的场景有其优势,但页面切换比较慢. 后端分页python3代码如下: paginator = Paginator(stat_list, numtmp) try: flight_stats = paginator.page(1) except PageNotAnInteger: flight_stats =

drf框架 token签发与校验、过滤/筛选/排序/分页组件

一.token 1.签发token 1)源码: # 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口 # 1)rest_framework_jwt.views.ObtainJSONWebToken 的 父类 JSONWebTokenAPIView 的 post 方法 # 接受有username.password的post请求 # 2)post方法将请求数据交给 rest_framework_jwt.serializer.JSONWebTokenSeri

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能

Android中ListView字母排序,实现字母挤压效果以及右侧快速选中字母,搜索关键字功能 本文中阐述如何自定义EditText实现搜索框自定义的样式以及挤压字母的思路等 自定义EditText 相关的drawable文件 主界面以及相关的适配器 结果展示 定义要呈现的EditText的样式 public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 定义删

〈三〉ElasticSearch的认识:搜索、过滤、排序

目录 上节回顾 本节前言 文档的搜索 URL参数条件搜索 请求体条件搜索 语法与示例: 补充: 小节总结: 文档的过滤filter 语法与举例: filter与bool constant_score cache 小节总结: 文档的聚合分析 准备数据 语法与举例: 其他语法: 补充: 小节总结: 文档的分页.排序 分页 排序 deep paging 补充: 小节总结: 发表日期:2019年9月20日 上节回顾 1.讲了如何对索引CRUD 2.重新解释了type,只是元数据的效果 3.讲了如何对文档

下载Lucene4.X实战类baidu搜索的大型文档海量搜索系统(分词、过滤、排序、索引)

Lucene是一个高性能.可伸缩的信息搜索(IR)库.目前最新版本是4.3.1. 它可以为你的应用程序添加索引和搜索能力.Lucene是用java实现的.成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License].同样,Lucene是当前非常流行的.免费的Java信息搜索(IR)库. Lucene4.X实战类baidu搜索的大型文档海量搜索系统(分词.过滤.排序.索引),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:htt