DRF集成django-filters时过滤不生效返回全量记录问题
问题根因
django-filters的FilterSet内部Meta类要求通过model属性绑定关联的模型类,你的代码里把属性名错写成了meta,导致框架无法识别绑定模型、也不会加载你配置的fields过滤规则,最终无论传入什么查询参数,都会直接返回传入的原始全量查询集。
修复步骤
- 修正
FieldFilter的Meta类配置,将错误的meta = Field替换为model = Field,修正后的代码如下:
class FieldFilter(django_filters.FilterSet): class Meta: model = Field fields = ("table__id", "type")
- (可选优化)移除冗余的
FieldFilterSerializer:django-filters本身会根据fields里定义的字段类型自动完成参数校验、类型转换,不需要额外编写序列化器校验查询参数,可以直接把request.query_params传入FilterSet,简化代码逻辑。简化后的视图、查询函数参考:
# 列表查询函数 def field_list(*, filters=None): filters = filters or {} qs = Field.objects.all() return FieldFilter(filters, qs).qs # 视图get方法 def get(self, request): fields = field_list(filters=request.query_params) serializer = FieldSerializer(fields, many=True) return Response(serializer.data, status=status.HTTP_200_OK)
验证方式
修复后发起带查询参数的请求,可以通过打印查询集的query属性查看生成的SQL语句,确认WHERE子句中包含了你传入的过滤条件,即代表过滤逻辑正常生效。
内容的提问来源于stack exchange,提问作者swaran
相关产品推荐
相关产品推荐

