00:00

文章目录

加载目录中...

DRF过滤组件

在 Django REST Framework(DRF)中,过滤组件用于对查询集进行筛选,方便前端根据条件获取所需数据。以下是 DRF 过滤组件的常用使用方式:

一、基础过滤:django-filter(推荐)

django-filter 是 DRF 官方推荐的过滤库,支持复杂的条件过滤(如等于、包含、范围等)。

1. 安装依赖

pip install django-filter

2. 配置

settings.py 中注册应用:

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

3. 基本使用

在视图中通过 filter_backends 指定过滤后端,并通过 filterset_fields 声明允许过滤的字段。

from rest_framework.viewsets import ModelViewSet
from django_filters.rest_framework import DjangoFilterBackend
from .models import Book
from .serializers import BookSerializer

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 指定过滤后端
    filter_backends = [DjangoFilterBackend]
    # 允许过滤的字段(支持多字段联合过滤)
    filterset_fields = ['category', 'author']  # 例如:按分类和作者过滤

前端请求示例

GET /api/books/?category=小说&author=鲁迅

二、高级过滤:自定义过滤规则

如果需要更复杂的过滤逻辑(如模糊查询、范围查询),可以自定义过滤类。

1. 定义过滤类

import django_filters
from .models import Book

class BookFilter(django_filters.FilterSet):
    # 自定义过滤字段:价格大于等于
    min_price = django_filters.NumberFilter(field_name="price", lookup_expr='gte')
    # 自定义过滤字段:价格小于等于
    max_price = django_filters.NumberFilter(field_name="price", lookup_expr='lte')
    # 模糊查询:书名包含某字符串
    title_contains = django_filters.CharFilter(field_name="title", lookup_expr='icontains')

    class Meta:
        model = Book
        fields = ['category', 'min_price', 'max_price', 'title_contains']  # 包含自定义字段

2. 在视图中使用

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend]
    # 指定自定义过滤类
    filterset_class = BookFilter

前端请求示例

GET /api/books/?category=小说&min_price=30&max_price=100&title_contains=正传

三、其他过滤方式

1. 搜索过滤(SearchFilter

用于全局搜索多个字段,支持模糊匹配(基于 icontains)。

from rest_framework.filters import SearchFilter

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [SearchFilter]
    # 可搜索的字段(多个字段用逗号分隔)
    search_fields = ['title', 'author']  # 搜索书名或作者包含关键词的结果

前端请求示例

GET /api/books/?search=鲁迅  # 搜索书名或作者包含“鲁迅”的书籍

2. 排序过滤(OrderingFilter

用于对结果进行排序。

from rest_framework.filters import OrderingFilter

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [OrderingFilter]
    # 可排序的字段
    ordering_fields = ['price', 'publish_date']
    # 默认排序(可选)
    ordering = ['-publish_date']  # 按发布日期降序(最新的在前)

前端请求示例

GET /api/books/?ordering=price  # 按价格升序
GET /api/books/?ordering=-price  # 按价格降序(加负号)

四、组合使用

可以同时启用多种过滤后端,例如同时支持条件过滤、搜索和排序:

class BookViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_fields = ['category']  # 条件过滤
    search_fields = ['title', 'author']  # 搜索
    ordering_fields = ['price', 'publish_date']  # 排序

总结

  • 简单条件过滤:用 django-filterfilterset_fields
  • 复杂过滤:自定义 FilterSet
  • 全局搜索:用 SearchFilter
  • 排序:用 OrderingFilter
返回文章列表

评论区 0