Что такое команда для поиска контента во всех полях модели одновременно? - PullRequest
1 голос
/ 20 сентября 2019

Я разрабатываю приложение с 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 Ответ

1 голос
/ 20 сентября 2019

Вы все равно должны будете указать все поля.Там нет ярлыка.Но вы можете объединить все поля и просто выполнить один поиск:

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.

...