Значение фильтра Django ORM по умолчанию, которое возвращает все объекты

У меня есть модель Book, в которой есть поле year_of_publishing. Пользователь вводит год, и я хочу отфильтровать набор Book, чтобы получить все книги, опубликованные в этом году.

year = self.cleaned_data.get('year', SOME_DEFAULT_VALUE)
books = Book.objects.filter(year_of_publishing=year)

Однако пользователь может оставить поле year пустым, и я хочу поставить какое-то значение по умолчанию, получение которого в функции .filter Django ORM вернет все книги, как будто этого фильтра вообще не было. Какое значение следует использовать? Я полагаю, что он должен быть независимым от типа, поэтому я могу использовать его для полей Char-, Choice- и других типов.


person Anton Khodak    schedule 04.01.2016    source источник
comment
честно говоря, я не понимаю это предложение: I want to put some default value, obtaining which in the .filter function Django ORM would return all the books like this filter was not present at all. не могли бы вы немного пояснить?   -  person doniyor    schedule 04.01.2016
comment
Я имел в виду, что ищу такое значение, для которого ModelName.objects.filter(field=value) вернет все объекты   -  person Anton Khodak    schedule 04.01.2016
comment
Ах, хорошо, тогда я неправильно понял вопрос, но Брэндон уже попал в точку, поэтому я удалил свой ответ.   -  person doniyor    schedule 04.01.2016


Ответы (2)


Вы можете передать пустой словарь .filter(), чтобы вернуть все результаты, или отфильтровать нужные поля/значения:

filters = {}

year = request.GET.get('year')
if year:
    filters['year'] = year

books = Book.objects.filter(**filters)
person Brandon    schedule 04.01.2016

Вы можете просто создать набор запросов со словарем:

parameters = ['year', 'foo', 'bar']
query_dict = {}

for parameter in parameters:
    if self.cleaned_data.get(parameter, None):
        query_dict[parameter] = self.cleaned_data.get(parameter)

books = Book.objects.filter(**query_dict)
person Shang Wang    schedule 04.01.2016
comment
Спасибо, это довольно очевидное решение, но у меня в форме много полей, и я подумал, что было бы более лаконично, если бы существовало что-то вроде того, что я описал. - person Anton Khodak; 04.01.2016
comment
Я отредактировал ответ. Возможно, вам придется заранее определить, какие поля вы хотите проверить, но это позволит избежать использования нескольких операторов if. - person Shang Wang; 04.01.2016