假设有一个模型 MyModel,其中有一个多选字段 categories
可写一个filters.FilterSet
from django_filters import rest_framework as filters
from .models import MyModel
class MyModelFilter(filters.FilterSet):
categories = filters.CharFilter(method='filter_categories')
def filter_categories(self, queryset, name, value):
categories = value.split(',') # 多选值以逗号分隔
return queryset.filter(categories__in=categories)
class Meta:
model = MyModel
fields = ('categories',) # 这里添加其他需要过滤的字段
接下来,在视图类中使用这个过滤器类。
from rest_framework import generics
from .models import MyModel
from .serializers import MyModelSerializer
from .filters import MyModelFilter
class MyModelList(generics.ListAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
filterset_class = MyModelFilter
在上面的示例中,将 MyModelFilter 分配给 filterset_class 属性。这将告诉 DRF 在进行列表查询时使用这个过滤器类。
现在,可以在 API 的查询参数中传递多选值来过滤结果。例如,假设API 路由是 /mymodels/,可以使用类似下面的查询参数来过滤结果:
GET /mymodels/?categories=category1,category2,category3