我正在使用Django开发应用程序。 我已经开发了一个搜索栏来过滤数据库内容。
我希望当用户单击搜索按钮时,在所有模型字段中搜索指示的内容。
我的模型有16个字段,所以我的过滤器命令将很长,例如:
selected_entries = glossary_entry.objects.filter(Q(field1__icontains=query) | Q(field2__icontains=query)) | ...ETC ETC... | Q(field16__icontains=query))
在这里,您可以在 views.py 中的我的视图功能中看到此行:
def glossario(request):
query = request.GET.get('q')
template = "glossario.html"
# query applied
if query:
query = request.GET.get('q')
selected_entries = glossary_entry.objects.filter(Q(field1__icontains=query) | Q(field2__icontains=query)) | ...ETC ETC... | Q(field16__icontains=query))
return render(request, template, {'all_entries':selected_entries})
# no query
else:
all_entries = glossary_entry.objects.all
return render(request, template, {'all_entries':all_entries})
是否有较短的命令可以执行相同的操作?
喜欢:
selected_entries = glossary_entry.objects.filter(Q(ALL_MODEL_FIELDS_ICONTAINS(model=MyModel)=query))
注意: ALL_MODEL_FIELDS_ICONTAINS
是我的发明
答案 0 :(得分:1)
无论如何,您都必须指定所有字段。没有捷径。但是您可以concatenate所有字段并只进行一次查找:
from django.db.models import CharField, Value as V
from django.db.models.functions import Concat
glossary_entry.objects.annotate(
search_string=Concat(
'field1', V(' '), 'field2', V(' '), 'field3', ...,
output_field=CharField()
)
).filter(search_string__icontains=q)
注意:我已经使用Value
在每个字段之间添加了空格,尽管对于icontains
来说并不是必须的,但是如果您查看search_string
的值,它仅有助于调试