You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST是否有自动过滤功能 支持URL参数或可选参数实现?

Django REST 框架过滤功能解答

内置过滤能力

Django REST 框架(DRF)本身提供了完善的URL参数过滤支持,默认没有全局开启,需要通过filter_backends配置项启用相关能力,原生内置三类基础过滤后端:

  • SearchFilter:对应URL参数search,可配置search_fields指定匹配字段,实现多字段模糊搜索
  • OrderingFilter:对应URL参数ordering,可配置ordering_fields指定允许排序的字段,实现结果升降序排列
  • 字段精确过滤:配合django-filter库提供的DjangoFilterBackend,仅需配置filterset_fields指定要开放过滤的模型字段,即可自动生成对应的URL参数过滤规则,无需额外编写业务代码。

示例基础配置:

from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # 启用三类过滤能力
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    # 配置支持精确过滤的字段,自动生成对应URL参数
    filterset_fields = ['category', 'author_id', 'publish_year']
    # 配置支持搜索的字段
    search_fields = ['book_name', 'description']
    # 配置支持排序的字段
    ordering_fields = ['publish_time', 'price']

配置完成后直接通过URL传参即可生效,例如请求/api/books?category=科幻&publish_year=2023,接口会自动返回分类为科幻、2023年出版的书籍数据。

可选参数过滤方案

如果需要更灵活的过滤规则(比如范围查询、模糊匹配、多条件组合),可以自定义过滤类实现,所有过滤参数默认都是可选的,用户仅传需要的参数即可,未传递的参数不会参与过滤逻辑:

  1. 首先安装django-filter依赖,这是DRF官方推荐的过滤扩展,兼容性极强
  2. 自定义过滤类,按需配置匹配规则:
import django_filters
from .models import Book

class BookFilter(django_filters.FilterSet):
    # 配置价格范围过滤,参数为min_price、max_price,可选
    min_price = django_filters.NumberFilter(field_name="price", lookup_expr='gte')
    max_price = django_filters.NumberFilter(field_name="price", lookup_expr='lte')
    # 配置书名模糊匹配,参数为book_name_like,可选
    book_name_like = django_filters.CharFilter(field_name="book_name", lookup_expr='icontains')

    class Meta:
        model = Book
        fields = ['category', 'author_id', 'min_price', 'max_price', 'book_name_like']
  1. 在视图中指定自定义过滤类:
class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    # 替换filterset_fields为自定义的过滤类
    filterset_class = BookFilter
    search_fields = ['book_name', 'description']
    ordering_fields = ['publish_time', 'price']

配置后可灵活组合参数请求,例如/api/books?category=科幻&min_price=30&book_name_like=三体,所有参数均可单独传递或者组合使用。

注意事项

  • 可以在项目settings中配置全局默认的filter_backends,无需每个视图单独配置
  • 不要开放敏感字段的过滤权限,避免导致数据泄露风险

内容的提问来源于stack exchange,提问作者inquiring_man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:30:01