如果查询参数错误,如何停止django REST框架以显示所有记录

use*_*546 5 django django-rest-framework

我正在使用Django REST Framework,我使用过滤器来过滤查询集.

http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters

像这样

http://example.com/api/products/4675/?category=clothing&max_price=10.00

但我已经看到,如果过滤器中有错误或查询参数不存在,那么它会显示所有非常糟糕的结果.

如果查询参数存在问题,我宁愿不想要结果,因为有时我不知道这是否有效

编辑

这是我的代码

class userFilter(django_filters.FilterSet):
    strict = True

    class Meta:
        model = User
        fields = ('is_active', 'is_archived', 'age')
Run Code Online (Sandbox Code Playgroud)

休息

class UserListCreateView(generics.ListCreateAPIView):
    queryset = User.objects.filter(is_archived=False)
    ordering_fields = ('is_active')
    filter_class = userFilter
Run Code Online (Sandbox Code Playgroud)

这是REST设置

REST_FRAMEWORK = {
    'DEFAULT_MODEL_SERIALIZER_CLASS':
        'rest_framework.serializers.HyperlinkedModelSerializer',
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
        'rest_framework.filters.OrderingFilter',
    ),
    # 'PAGINATE_BY': 1,                 
    'PAGINATE_BY_PARAM': 'page_size',  
    'MAX_PAGINATE_BY': 100,             
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    )
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*l B 3

如果您使用DjangoFilterBackend,请查看严格的 Non-Meta 选项

strict 选项控制当用户为任何筛选字段指定无效值时是否返回结果。默认情况下,strict 设置为 True,这意味着如果任何字段包含无效值,则返回空查询集。您可以通过将 strict 设置为 False 来放松此行为,这将有效地忽略过滤器字段(如果其值无效)。

过滤器:

from django_filters.filterset import FilterSet

class UserFilter(FilterSet):
    strict = True

    class Meta:
        model = User
        fields = ['username']
Run Code Online (Sandbox Code Playgroud)

设置:(假设您已经安装了django-filter

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
}
Run Code Online (Sandbox Code Playgroud)

现在,如果有人这样做:

http://api.example.com/users/?username=myuser&badfilter=1
Run Code Online (Sandbox Code Playgroud)

...它将返回一个空列表,因为badfilter不存在。

由于FilterSet自动默认为strict=True,我有一种感觉,您没有利用DjangoFilterBackend.