DRF - 使用django-filters向开发人员提供有关错误输入的反馈

时间:2016-08-12 16:51:54

标签: django rest django-rest-framework django-filter

我正在使用django rest框架开发REST API,但我找不到使用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 =昨天,API不会收到有关请求错误的反馈,而是返回一个没有任何结果的列表。这并不表示开发人员提出了错误的请求,这可能只是意味着这些条款下没有事件。

与布尔值相反,如果在我的请求中我发送 {url} /?is_important = maybe ,它将返回所有结果而不进行任何过滤。

所以,我的问题是:DRF是否有办法验证这些输入并向开发人员返回有意义的响应?谢谢。

2 个答案:

答案 0 :(得分:1)

django-filter有strict属性,用于控制验证错误的处理。

import django_filters as filters
from django_filters.filterset import STRICTNESS

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

    strict = STRICTNESS.RAISE_VALIDATION_ERROR

    class Meta:
        model = Event

答案 1 :(得分:0)

以上导入将导致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()

我的datetimefield上的示例工作api调用(时间必须存在):

GET / api / xxxx?start_date = 2015-01-01T0:0:00Z