📌  相关文章
📜  在 Django REST Framework 中自定义过滤器(1)

📅  最后修改于: 2023-12-03 14:50:54.126000             🧑  作者: Mango

在 Django REST Framework 中自定义过滤器

Django REST Framework(简称DRF)是 Django 框架的一部分,它为我们提供了快速创建 RESTful API 的工具。DRF 内置了许多过滤器用于筛选查询集的数据,但是有时候我们需要定义自己的过滤器来满足自己的需求。

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

这将只显示创建者为 adminMyModel 对象。

总结

本文介绍了如何在 Django REST Framework 中自定义过滤器,以及如何为过滤器添加文档。自定义过滤器可以让我们更加灵活地控制 API 的输出,满足我们更多的需求。