在开发项目过程中,有多个搜索框输入,每个输入有精准查询或者范围查询等
1、我想要实现如果只输入一个条件,那么只需要这一个条件查询
2、如果输入多个条件,那就多个条件一起查询
也就是查询变量是可变的
Django里面用到的Entry.objects.filter()函数,大部分用的就是必须输入查询变量和指定的值
类似这样
Entry.objects.filter(field1=value1)
Entry.objects.filter(field1=value1,field2=value2,...)
如果我要满足我的需求,那么有些搜索框为空的就必须输入进去,但是数据库查询显示为空搜不到,如果我用if判断也太麻烦了,假如我有十几个搜索条件
也上网百度好多答案,有一个做法就是下载django_fitler模块,自定义过滤类,这太麻烦了!!!
这时候发现有一个函数很好用,filter(**kargs)
这个就是可以先定义好过滤的数据类似json形式的数据,再直接填入fiter参数里面
下面就是我的做法,简单快捷
# dd={"year__contains":20,"area":"上海"}
dd={}
print(type(dd)) #dict类型
for key,value in data1.items(): #这里的data1是我传入进来的一个dict类型的过滤数据
if value!='':
dd[key]=value
print(dd)
qRes = Entry.objects.filter(**dd) #Entry就是你python项目定义的数据库类
1、上面代码里面的dd就是我经过处理后最终传入的参数,
我的前端传来data1数据,里面的数据我还要再经过一次处理,通过dict类型的key,value遍历,如果value为空,也就是某一个变量的输入框为空,那么dd就不加入这个过滤参数
2、特别注意的是,这个dd里面的定义的key-value值也可以符合Django ORM 数据库查询规则
比如我写了dd={"year__contains":20,"area":"上海"}代表year属性包含20的都需要筛选出来
contain代表包含,记得属性与那个ORM规则之间是2个_长一点
常见的ORM规则
exact:精确匹配
iexact:不区分大小写 精确匹配
contains:包含指定值
icontains:不区分大小写的包含指定值
in:某个字段的值在给定的列表中
gt:>指定值
gte:>=指定值
lt:<指定值
lte:<=指定值
startswith:以指定值开头
istartswith:不区分大小写以指定值开头
endswith:以指定值结尾
iendswith:不区分大小写以指定值结尾
range:表示在给定范围内的对象,例如:Model.objects.filter(field__range=[value1, value2])。
date:表示指定日期的对象,例如:Model.objects.filter(field__date=date(2022, 1, 1))
year 日期字段的年份
month 日期字段的月份
day 日期字段的日
isnull / isnotnull 判空
excute 不等于
Entry.objects.filter(field1__date=date(2023, 10, 30))
Entry.objects.filter(field1__in=[value1, value2]))
Entry.objects.filter(field1__range=[value1, value2])
Entry.objects.filter(tield1__isnull=True)
其他基本都是属性__ORM=value