我正在尝试在 DRF 中使用过滤器集。但没有任何效果:我的查询参数被忽略了。当我从导航栏强制它们时,也没有任何附加内容。
我尝试过使用 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,
}
我的设计到底有什么问题?
您的自定义过滤器似乎有点奇怪。也许尝试从最简单的方法开始:使用默认值。
设置:
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