如何在Wagtail的PagesAPIViewSet中按关联模型字段筛选?
解决方案
你完全可以用DRF自带的DjangoFilterBackend实现按分类名称筛选的需求,不需要自定义筛选后端,具体步骤如下:
先确认依赖安装
确保已经安装了django-filter:pip install django-filter配置过滤后端
可以选择全局配置或仅在当前视图集局部生效:- 全局配置(在项目
settings.py中):REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': [ 'django_filters.rest_framework.DjangoFilterBackend', ] } - 局部配置(仅针对
EntriesViewSet):
修改你的视图集代码,添加过滤相关配置:from django_filters.rest_framework import DjangoFilterBackend class EntriesViewSet(PagesAPIViewSet): base_serializer_class = EntryPageWithSiblingsSerializer model = EntryPage body_fields = PagesAPIViewSet.body_fields + EntryPageWithSiblingsSerializer.Meta.fields listing_default_fields = PagesAPIViewSet.listing_default_fields + EntryPageWithSiblingsSerializer.Meta.fields detail_only_fields = ["prev_entry", "next_entry"] # 添加过滤后端 filter_backends = [DjangoFilterBackend] # 指定允许跨关联筛选的字段 filter_fields = ['categories__name']
- 全局配置(在项目
测试筛选功能
现在就可以用你想要的请求路径进行筛选了:/wt/api/nextjs/v1/blog_entries/?categories__name=name该请求会返回所有关联了名称为
name的Category的EntryPage实例。进阶:自定义过滤规则(可选)
如果需要更灵活的筛选逻辑(比如大小写不敏感的模糊匹配),可以自定义FilterSet类:import django_filters from .models import EntryPage class EntryPageFilter(django_filters.FilterSet): # 支持大小写不敏感的模糊匹配 categories__name = django_filters.CharFilter(field_name='categories__name', lookup_expr='icontains') class Meta: model = EntryPage fields = ['categories__name']然后在视图集中替换为自定义的FilterSet:
class EntriesViewSet(PagesAPIViewSet): # ... 其他原有属性 filter_backends = [DjangoFilterBackend] filterset_class = EntryPageFilter这样就能支持类似
/?categories__name=NAME(不区分大小写)的筛选请求。
内容的提问来源于stack exchange,提问作者Yura Khkyan
相关产品推荐
相关产品推荐

