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(): | 去重 |