Во-первых, я сделал домашнее задание и огляделся перед публикацией! Мой вопрос кажется очень простой, что, должно быть, было рассмотрено раньше.django model search form
В настоящее время я рассматриваю Django-filter как потенциальное решение, но хотел бы посоветовать, если это правильный путь, и если есть какие-либо другие решения.
У меня есть приложение Django с 10 моделями, каждая модель имеет несколько полей. В большинстве полей ChoiceField
пользователи заполняют формы с помощью стандартного select
виджета. Для каждой модели есть отдельная форма.
Я хочу создать отдельную форму для каждой модели (в отдельных представлениях), которую пользователи будут использовать для поиска в базе данных. Форма поиска будет содержать только раскрывающийся список (select
виджетов) с теми же вариантами, что и формы, используемые для заполнения базы данных с добавлением опции «любой».
Я знаю, как использовать .object.filter()
, однако «любой» вариант будет соответствовать не включать определенные поля в фильтре, и я не знаю, как добавить модель поля в фильтр на основе выбора пользователей
Я коротко посмотрел на Haystack в качестве опции, но, похоже, для полнотекстового поиска, а не для «моделированного поиска», я после.
Пример модели (упрощенный):
class Property():
TYPE_CHOICES = (‘apartment’, ‘house’, ‘flat’)
type = charfield(choices=TYPE_CHOICES)
LOC_CHOICES = (‘Brussels’, ‘London’, ‘Dublin’, ‘Paris’)
location = charfield(choices=LOC_CHOICES)
price = PostivieInteger()
Пользователи могут выбрать только «тип», только «расположение» или оба (не делает выбор равно любому) и в этом случае я в конечном итоге с 3 различными фильтрами :
Property.objects.filter(type=’apartment’)
Property.objects.filter(location=’Dublin’)
Property.objects.filter(type=’apartment’, location=’Dublin’)
Главный вопрос: django-filter лучший вариант?
Question 1: what’s the best option of accomplishing this overall?
Question 2: how do I add model fields to the filter based on user’s form selection?
Question 3: how do I do the filter based on user selection? (I know how to use .filter(price_lt=).exclude(price_gt=) but again how do I do it dynamically based on selection as “ANY” would mean this is not included in the query)