Tastypie通过外键过滤失效,如何配置跨关联外键的GET参数过滤?
问题原因
过滤不生效主要是两个核心配置遗漏:
- 未导入Tastypie的过滤规则常量
- Tastypie默认不支持直接在
filtering中声明跨外键的双下划线路径字段,需要显式开启关联资源的过滤权限
完整解决方案
首先在文件顶部导入必要的依赖:
from tastypie.fields import ForeignKey from tastypie.constants import ALL, ALL_WITH_RELATIONS
先定义关联的DiveResource,再修改DensityResource声明外键关联、开启关联过滤:
class DiveResource(ModelResource): class Meta: queryset = Dive.objects.all() # 可按需添加Dive模型自身的过滤、排序规则 class DensityResource(ModelResource): # 显式声明外键关联,第二个参数为Density模型中dive字段的名称 dive = ForeignKey(DiveResource, 'dive', full=False) class Meta: queryset = Density.objects.all() filtering = { # 开启dive关联下的字段过滤权限,支持双下划线跨关联查询 'dive': ALL_WITH_RELATIONS } ordering = ['measurement_time', 'depth']
配置完成后,/?dive__drone_id=13的过滤请求即可正常生效,原有排序功能不受影响。
可选简化方案
如果不需要完整暴露Dive资源,也可以重写DensityResource的build_filters方法自定义过滤逻辑,无需定义额外的关联资源:
class DensityResource(ModelResource): class Meta: queryset = Density.objects.all() ordering = ['measurement_time', 'depth'] def build_filters(self, filters=None, ignore_bad_filters=False): if filters is None: filters = {} orm_filters = super().build_filters(filters, ignore_bad_filters) # 手动处理dive__drone_id过滤参数 if 'dive__drone_id' in filters: orm_filters['dive__drone_id'] = filters['dive__drone_id'] return orm_filters
内容的提问来源于stack exchange,提问作者wogsland
相关产品推荐
相关产品推荐

