Поиск по нескольким полям модели Django без стороннего приложения - PullRequest
3 голосов
/ 20 декабря 2010

В моем приложении django есть одна модель, для которой я хочу создать форму поиска. Есть ли способ поиска по всем полям в модели с одинаковой строкой поиска? Я посмотрел на xapian и solr, но они кажутся слишком сложными для поиска более 1 модели. Я хочу иметь возможность сказать что-то вроде:

results = Assignment.objects.filter(any_column = search_string)

Я понимаю, что не может быть чего-то такого лаконичного, но сейчас единственный вариант, который я могу придумать, кроме использования приложения поиска, это проверить каждое поле отдельно и объединить результаты вместе.

Ответы [ 2 ]

12 голосов
/ 20 декабря 2010

Когда у вас есть все имена полей , вы можете создавать Q объекты , используя расширение kwarg и использовать reduce() вдоль с operator.or_, чтобы превратить их в один запрос.

qgroup = reduce(operator.or_, (Q(**{fieldname: value}) for fieldname in fieldnames))
asgns = Assignment.objects.filter(qgroup)
0 голосов
/ 26 октября 2016

Старый вопрос, но для дальнейшего использования я добавляю:

В django 1.10 добавлен класс SearchVector .

Использование из документов:

Поиск по одному полю - это здорово, но довольно ограниченно. Экземпляры Entry, которые мы ищем, принадлежат блогу, в котором есть поле слогана. Чтобы выполнить запрос к обоим полям, используйте SearchVector:

>>> from django.contrib.postgres.search import SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', 'blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...