DRF - Предоставление отзыва разработчику о неправильных входных данных с использованием django-filters

Я разрабатываю REST API с фреймворком django rest, но не нахожу способа проверить входные данные запроса с помощью django-filters.

Например, скажем, у меня есть модель:

class Event(models.Model):
    timestamp = models.DateTimeField(help_text="Time it was created")
    is_important = models.BooleanField(help_text="If the event is important")

И у меня есть фильтр:

class EventFilter(filters.FilterSet):
    important = filters.BooleanFilter(name='is_important')
    since = filters.IsoDateTimeFilter(name='timestamp', lookup_type='gt')

    class Meta:
        model = Event

Если в своем запросе я вставлю неверную дату, например {url}/?since=2016-02-31T00:00Z или {url}/?since=yesterday, вместо получения обратной связи о том, что не так с запросом, API просто вернет список без каких-либо результатов. Это не означает, что разработчик сделал неверный запрос, это может просто означать, что в соответствии с этими условиями нет событий.

Обратное происходит с логическими значениями, если в моем запросе я отправлю {url}/?is_important=maybe, он вернет все результаты без какой-либо фильтрации.

Итак, мой вопрос: есть ли у DRF способ проверки такого рода входных данных и возврата содержательного ответа разработчику? Спасибо.


person Joao Garcia    schedule 12.08.2016    source источник


Ответы (2)



from django_filters.filterset import STRICTNESS

Вышеприведенный импорт приведет к ImportError: невозможно импортировать имя «STRICTNESS»

Это связано с перемещением СТРОГОСТИ: https://django-filter.readthedocs.io/en/latest/guide/migration.html#filterset-strictness-handling-moved-to-view-788

Официальной документации пока нет, но мне удалось вызвать/вызвать ошибку, переопределив FilterBackend из комментария https://github.com/carltongibson/django-filter/pull/788#issuecomment-409635087

class StrictDjangoFilterBackend(django_filters.rest_framework.DjangoFilterBackend):
    """Return no results if the query doesn't validate."""

    def filter_queryset(self, request, queryset, view):
        try:
            return super().filter_queryset(request, queryset, view):
        except serializers.ValidationError:
            return queryset.none()

пример рабочего вызова API для моего поля datetime (время должно присутствовать):

GET /api/xxxx?start_date=2015-01-01T0:0:00Z
person newbee    schedule 12.10.2019