背景
在实际项目中,我们会遇到前端传过来的查询条件不固定的情况,我们不好用固定的查询条件去处理。
如下图,很多条件会是空值,而且每次传过来有值的条件不一样,我们需要将有值的条件筛选出来。
那么,怎么筛选以及筛选后得到的条件数据怎么用来查询呢?
解决思路
因为用户未选择的查询字段的值是空值或空字符串,我们可以遍历所有字段,筛选出查询条件,保存在字典中,查询时利用**操作符对字典进行解引用,即可达到我们想要的效果。
// 遍历筛选
def getKwargs(data={}):
kwargs = {}
for (k, v) in data.items():
if v is not None and v != "":
kwargs[k] = v
return kwargs
查询示例
# 获取前端传过来的数据
projectName = request.POST["projectName"]
if projectName:
project = Project.objects.get(user=user, projectName=projectName)
else:
project = ""
user = User.objects.get(userId=userId)
startTime = request.POST["startTime"]
endTime = request.POST["endTime"]
# 将传过来的查询条件封装成字典形式,键名为数据库中对应的字段
# 如果是json数据就使用dictCheck=json.loads(data)
dictCheck = {"user": user, "project": project, "createTime__gt": startTime, "createTime__lt": endTime}
dictFor = getKwargs(dictCheck)
#利用**解引用,进行数据条件查询
tasks = RecognitialTask.objects.filter(**dictFor)