在 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-filter的filterset_fields - 复杂过滤:自定义
FilterSet类 - 全局搜索:用
SearchFilter - 排序:用
OrderingFilter
评论区 0