📅  最后修改于: 2023-12-03 14:50:54.126000             🧑  作者: Mango
Django REST Framework(简称DRF)是 Django 框架的一部分,它为我们提供了快速创建 RESTful API 的工具。DRF 内置了许多过滤器用于筛选查询集的数据,但是有时候我们需要定义自己的过滤器来满足自己的需求。
DRF 内置了以下过滤器:
django_filters.rest_framework.DjangoFilterBackend
: 基于 Django Filter 的过滤器rest_framework.filters.SearchFilter
: 按关键字搜索过滤器rest_framework.filters.OrderingFilter
: 排序过滤器我们可以通过 DEFAULT_FILTER_BACKENDS
设置默认的过滤器:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
],
}
我们可以通过继承 rest_framework.filters.BaseFilterBackend
类来自定义过滤器,并实现以下方法:
filter_queryset(self, request, queryset, view)
: 过滤查询集并返回过滤后的查询集get_schema_fields(self, view)
: 为过滤器添加文档下面我们以实现按创建者的权限来过滤查询集为例:
# filters.py
from rest_framework import filters
class CreatorFilterBackend(filters.BaseFilterBackend):
"""
Filter the queryset to only show objects created by current user.
"""
def filter_queryset(self, request, queryset, view):
if request.user.is_superuser:
return queryset
return queryset.filter(created_by=request.user)
def get_schema_fields(self, view):
return [
coreapi.Field(
name='created_by',
location='query',
required=True,
schema=coreschema.Object(
properties={
'created_by': coreschema.String(),
},
required=['created_by'],
),
),
]
我们需要在视图类里添加过滤器,这可以通过设置 filter_backends
来实现。下面是示例代码:
# views.py
from rest_framework.viewsets import ModelViewSet
from myapp.serializers import MyModelSerializer
from myapp.models import MyModel
from myapp.filters import CreatorFilterBackend
class MyModelViewSet(ModelViewSet):
serializer_class = MyModelSerializer
queryset = MyModel.objects.all()
filter_backends = [CreatorFilterBackend]
我们可以在浏览器中输入以下网址来测试我们的自定义过滤器:
http://localhost:8000/api/mymodels?created_by=admin
这将只显示创建者为 admin
的 MyModel
对象。
本文介绍了如何在 Django REST Framework 中自定义过滤器,以及如何为过滤器添加文档。自定义过滤器可以让我们更加灵活地控制 API 的输出,满足我们更多的需求。