在DRF的django-filters方法过滤器中如何访问form.cleaned_data
Django REST Framework中FilterSet自定义方法过滤器访问cleaned_data的解决方法
你的问题出在自定义过滤函数没有作为FilterSet类的实例方法存在,所以无法通过self访问表单数据。解决方法很直接:
- 将
filter_by_search函数移到CarFilter类内部,作为类的实例方法,这样第一个参数就是self,就能直接访问self.form.cleaned_data了。
修正后的完整代码如下:
import django_filters as filters from django.db.models import Q class CarFilter(filters.FilterSet): name = filters.CharFilter(field_name="name") vendor = filters.CharFilter(field_name="vendor__name") search = filters.CharFilter(method="filter_by_search") def filter_by_search(self, queryset, name, value): # 通过self.form.cleaned_data获取其他过滤字段的值 if not self.form.cleaned_data.get("name"): # 这里写你的过滤逻辑,示例:按name或vendor名称模糊匹配 return queryset.filter(Q(name__icontains=value) | Q(vendor__name__icontains=value)) # 如果name字段有值,返回原查询集或执行其他逻辑 return queryset
注意事项:
- 方法必须定义在FilterSet类内部,且第一个参数必须是
self,才能访问实例的form属性。 cleaned_data中的键对应你在FilterSet里定义的字段名(比如这里的"name"就是类里的name过滤字段)。- 自定义过滤方法必须返回处理后的
queryset对象,否则会导致过滤失效。
内容的提问来源于stack exchange,提问作者Empusas
相关产品推荐
相关产品推荐

