我设置了一个数据库,并且希望设置搜索引擎,以便在搜索输入到不同搜索字段中的所有内容时忽略空字段。现在我使用 AND 语句(“,”)和 OR 语句(“|”)的组合,但我不知道如何编写它来忽略空复选框和文本值,但只搜索填充的复选框和文本我的views.py中的搜索代码是:
incidents = Incident.objects.filter(
Q(datepicker__range=[date_start, date_end]),
Q(country__contains=country),
Q(city__contains=city)
| Q(state__contains=state)
| Q(province__contains=province)
| Q(used_firearm__contains=firearm)
| Q(used_taser__contains=taser)
| Q(used_teargas__contains=teargas)
| Q(victim_1_name__contains=victim_name)
| Q(victim_1_ethnicity__contains=victim_ethnicity)
| Q(victim_1_age__contains=victim_age)
| Q(victim_1_sex__contains=victim_sex)
| Q(victim_1_status__contains=victim_status)
| Q(victim_1_armed__contains=victim_armed)
)
日期选择器范围和国家/地区是必需的,然后其他所有内容都是 OR 语句。例如,如果该国家/地区是美国,那么我希望它按州搜索,但如果该国家/地区是加拿大,我希望它按省搜索。如果两者都没有填写,我希望它忽略两者。
例如,现在,如果我选择开始日期和结束日期,国家/地区为美国并选择victim_1_name,它将仅返回日期范围内的所有内容,无论名称如何。如何让它忽略空白字段,同时对填充的字段使用 AND 连接器?
另外,像“used_firearm”和“used_taser”这样的东西是复选框,我用于读取这些字段的views.py是:
if request.POST.get('used_teargas', False):
teargas = request.POST['used_teargas']
如果复选框为空,则足以让它忽略该复选框,而如果选中则传递“True”值?
最佳答案
也许是这样的:
text_fields = {
'city': request.POST.get('city'),
'state': request.POST.get('state'),
'province': request.POST.get('province'),
'used_teargas': request.POST.get('teargas'),
'victim_1_name': request.POST.get('victim_name'),
'victim_1_ethnicity': request.POST.get('victim_ethnicity'),
'victim_1_age': request.POST.get('victim_age'),
'victim_1_sex': request.POST.get('victim_sex'),
'victim_1_status': request.POST.get('victim_status'),
}
boolean_fields = {
'used_taser': request.POST.get('taser'),
'used_teargas': request.POST.get('teargas'),
'victim_1_armed': request.POST.get('victim_armed')
}
q_objects = Q()
for field, value in text_fields.iteritems():
if value:
q_objects |= Q(**{field+'__contains': value})
for field, value in boolean_fields.iteritems():
if value:
q_objects |= Q(**{field: True})
incidents = Incident.objects.filter(
Q(datepicker__range=[date_start, date_end]),
Q(country__contains=country),
q_objects
)
生成的查询与您提供的查询非常相似,唯一的区别是列表或 or
ed (|
) Q
对象(此处名为 q_objects
)是动态构建的 - 允许您提供特定字段是否应包含在该列表中的规则(在该特定情况下为“if value
”)。这将完全满足您的要求 - 过滤掉空字符串、False
值和 None
值)。
您还应该研究专用的搜索解决方案,例如 Haystack .
关于Python Django "and/or"在数据库中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19457532/