You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:23:18