我正在使用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是否有办法验证这些输入并向开发人员返回有意义的响应?谢谢。
答案 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”
尚无官方文档,但我能够通过在评论中覆盖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