一次搜索所有模型字段中的内容的命令是什么?

时间:2019-09-20 14:53:21

标签: django search filter searchbar

我正在使用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是我的发明

1 个答案:

答案 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的值,它仅有助于调试