Django-filter 使用详解

Django-filter 过滤器简单使用

在django中,filter允许我们对QuerySet进行筛选和过滤。

前言

在前端页面,需要按多个条件查询显示相关信息时,我们可以使用django-filter来进行查询过滤信息

安装 django-filter

pip install django-filter

在项目中 settings.py添加django_filters到 INSTALLED_APPS

>INSTALLED_APPS = [
    ...
    'django_filters',
]

简单使用

Django-filter 提供了一种基于用户提供的参数过滤查询集的方法
例如:
1.前端页面对 产品表 多个条件查询功能
在这里插入图片描述
2.产品表模型
在这里插入图片描述
过滤器设置。用户可以根据店铺名称、产品型号、子商品和时间进行过滤

3.通过模型快速构建过滤器类

参数说民
field_name过滤字段名,一般应该对应模型中字段名
lookup_expr查询所需要的皂搓
# field_name 对应模型中字段名
# 字段名要和前端请求参数名一致
# lookup_expr 查询方式  icontains 模糊查询:包含、忽略大小写。exact 精确查询
class productFilter(django_filters.FilterSet):
    Ppro_type = django_filters.CharFilter(field_name="pro_type", lookup_expr='icontains')
    pro_type = django_filters.CharFilter(field_name="pro_type", lookup_expr='icontains')
    zpro_type = django_filters.CharFilter(field_name="zpro_type", lookup_expr='icontains')
    # storeid 外键
    storeid = django_filters.CharFilter(field_name='storeuser_id__storeid', lookup_expr='icontains', help_text="用户名")
	# 时间范围的过滤
    select_start_date = django_filters.DateTimeFilter(field_name='date_excel', lookup_expr='gte')
    select_end_date = django_filters.DateTimeFilter(field_name='date_excel', lookup_expr='lte')
    class Meta:
        model = product  # 模型名
        # 可以使用的过滤字段
        fields =  ['Ppro_type','storeid','zpro_type','pro_type','select_start_date','select_end_date']
        exclude = []  # 排除字段,不允许使用列表中的字典进行过滤

4.在视图中使用过滤器

 # 过滤  f就是已经过滤之后的值了
        f = productFilter(request.POST, queryset=product.objects.all())
        # valuesqueryset
        # 对过滤后的数据进行分组整合求和操作
        get_echarts_data = f.qs.values('date_excel').order_by('date_excel').annotate(
            ordersale=Sum("ordersale"),
            sessionTotal=Sum("sessionTotal"),
            sessionApp=Sum("sessionApp"),
            sessionWeb=Sum("sessionWeb"),
            viewApp=Sum("viewApp"),
            viewWeb=Sum("viewWeb"),
            viewTotal=Sum("viewTotal"),
            orderProTotal=Sum("orderProTotal"),
            orderPro=Sum("orderPro"),
        )
        # valuesqueryset转换为json。
        get_echarts_data = json.dumps(list(get_echarts_data), cls=DjangoJSONEncoder)

模糊查询常用操作

  • __exact 精确等于,
  • __iexact 精确等于 忽略大小写
  • __contains 包含
  • __icontains 包含,忽略大小写

product.objects.filter(storeuser__exact=“HY8356”)

  • __gt 大于 >
  • __gte 大于等于 >=
  • __lt 小于 <
  • __lte 小于等于 <=

product.objects.filter(sessionApp__gt=10)

  • __in

product.objects.filter(sessionApp__in=[1, 5, 6, 17, 89])

  • is null / is not null 判空

product.objects.filter(zpro_type__isnull=True) // 查询子商品为空的数据

  • excute 不等于不包含

product.objects.filter().excute(zpro_type=“zt2765”) 查询子商品不为zt2765的数据

  • __startswith 以…开头
  • __istartswith 以…开头 ,忽略大小写
  • __endswith 以…结尾
  • __iendswith 以…结尾,忽略大小写
  • __range 在…范围内
  • __year 日期字段的年份
  • __month 日期字段的月份
  • __day 日期字段的日

查询

方法使用
all()查询所有结果
get(**kwargs):返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
exclude(**kwargs):不包含
filter(**kwargs)它包含了与所给筛选条件相匹配的对象
order_by对查询结果进行排序
reverse():对查询结果反向排序,倒叙
count查询结果数量
first():返回第一条记录
last():返回最后条记录
values(*field):
values_list(*field):
distinct():去重
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值