DRF什么都过滤不了

问题描述 投票:0回答:1

我正在尝试在 DRF 中使用过滤器集。但没有任何效果:我的查询参数被忽略了。当我从导航栏强制它们时,也没有任何附加内容。

enter image description here

我尝试过使用 ModelViewSet 和 ListAPIView,但一次又一次地失败。就像我的 DjangoFilterBackend 被忽略了......这是我的代码:

class Ser(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Project
        fields = ['id', 'name']

class Fil(FilterSet):
    class Meta:
        model = models.Project
        fields = ['id', 'name']
        # fields = {'id': ['in',], 'name': ['iexact',]} # not working too

class SomeListing(generics.ListAPIView):
    serializer_class = Ser
    queryset = models.Project.objects.all()
    filterset_class : Fil

urlpatterns += path(f"{settings.API_URL_PREFIX}fii/", SomeListing.as_view(), name="fii-list"),
    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS':(
            'django_filters.rest_framework.DjangoFilterBackend',
            "rest_framework.filters.OrderingFilter",
        ),
        "DEFAULT_PERMISSION_CLASSES": ("rest_framework.permissions.IsAuthenticated",),
        "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
        "DATETIME_FORMAT": "%Y-%m-%d %H:%M:%S",
        'DEFAULT_SCHEMA_CLASS': DEFAULT_SCHEMA_CLASS,
        "PAGE_SIZE": 20,
    }

我的设计到底有什么问题?

django-rest-framework django-filter
1个回答
0
投票

您的自定义过滤器似乎有点奇怪。也许尝试从最简单的方法开始:使用默认值。

设置:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'django_filters',
    ...
]


REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': [
            'django_filters.rest_framework.DjangoFilterBackend',
            "rest_framework.filters.OrderingFilter",
    ],
}

视图设置:

from core.models import Pizza
from recipes.serializers import PizzaSerializer
from rest_framework import viewsets


class OrderViewSet(viewsets.ModelViewSet):

    queryset = Pizza.objects.all()
    serializer_class = PizzaSerializer
    filterset_fields = ['price', 'name', 'chef', 'toppings']

这通过过滤精确值启用基本的东西。对于更高级的东西,创建一个过滤器集。这几乎是从 django_filter docs 复制的,启用 min_price,max_price 过滤:

from core.models import Pizza
from django_filters import rest_framework as filters
from recipes.serializers import PizzaSerializer
from rest_framework import viewsets


class ProductFilter(filters.FilterSet):
    # enables ?min_price=
    min_price = filters.NumberFilter(field_name="price", lookup_expr='gte')
    # enables ?max_price=
    max_price = filters.NumberFilter(field_name="price", lookup_expr='lte')

    class Meta:
        model = Pizza
        fields = ['price', 'name', 'chef', 'toppings']


class OrderViewSet(viewsets.ModelViewSet):

    queryset = Pizza.objects.all()
    serializer_class = PizzaSerializer
    filterset_class = ProductFilter
© www.soinside.com 2019 - 2024. All rights reserved.