django-filter возвращает пустой набор запросов при неверном параметре запроса

Есть ли способ заставить FilterSet возвращать пустой набор запросов, если задан недопустимый параметр запроса? Например, в people/?name=joe&asdf=asdf name является допустимым столбцом в модели, а asdf не имеет значения. В настоящее время django-filter возвращает все объекты.

Я могу вручную проверить, все ли параметры действительны, но мне было интересно, есть ли лучший способ сделать это.


person Sam R.    schedule 01.12.2014    source источник


Ответы (2)


Предположим, ваша модель называется People.

if parameter not in [ f.name for f in People._meta.fields ]:
    return People.objects.none()

Вы можете проверить, соответствует ли каждый параметр полям модели. Возврат и пустой набор запросов модели, если ваш GETparameter недействителен.

Должен быть комментарий OP:

Если параметр запроса недействителен, должно быть возбуждено исключение FieldError:

try:
    qs=People.objects.filter(**request.GET)
except FieldError:
    qs=People.objects.none()
person dani herrera    schedule 01.12.2014
comment
Он не возвращает набор запросов, когда в request.GET будут средства доступа к связанным полям, например some_fk_field__name=asdf - person madzohan; 01.12.2014
comment
Как насчет предоставления пользователю ответа об ошибке при неверном вводе? Очень удобно для других разработчиков. - person Stephan; 16.05.2017
comment
@Стефан, это всего лишь фрагмент кода. Очевидно, вы должны завершить, чтобы получить удобный пользовательский интерфейс. Вы запрашиваете тему, отличную от OP, в любом случае взгляните на структуру сообщений django. - person dani herrera; 16.05.2017
comment
@danihp Вы хотите вызвать ValidationError. django-rest-framework.org/api-guide/exceptions/# validationerror таким образом другие разработчики могут получить понятный ответ. - person Stephan; 17.05.2017
comment
@Стефан, хорошая встреча. Я не включаю его в ответ, потому что он предназначен только для сред API (они все еще кодируют людей без уровня REST). В любом случае, спасибо. - person dani herrera; 17.05.2017

Это не django-filter проблема.

filter_obj = filter_class(self.request.GET, queryset=self.get_queryset())

Вы можете сделать это в своих представлениях, пока get_queryset:

def get_queryset(self):
    if all(map(lambda x: any(x == f for f in self.filter_class.declared_filters), self.request.GET)):
        queryset = self.model.objects.all()
    else:
        queryset = self.model.objects.none()

    return queryset
person madzohan    schedule 01.12.2014
comment
Забавно, 5 часов без ответа, и мы оба пишем в одно и то же время. Что это за распределение. - person dani herrera; 01.12.2014
comment
@danihp stackoverflow.com/questions/tagged/django-filter более забавен, ОП спрашивал три раза подряд , и каждый вопрос имеет меньше тегов, чем предыдущий на один - person madzohan; 01.12.2014