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

如何用django-filter实现跨关联模型的ORM过滤逻辑?

用django-filter实现跨关联模型的过滤逻辑

我有三个Django模型,需要用django-filter进行数据过滤。已经能通过ORM语句Employee.objects.filter(companyrecord__company__cname__icontains="ompanyname")实现目标过滤,但不清楚如何通过filters.FilterSet来实现相同的逻辑。

模型代码

class Employee(models.Model):
    employee_name = models.CharField(...)

class CompanyRecord(models.Model):
    employee = models.ForeignKey(Employee)
    company = models.ForeignKey(Company)

class Company(models.Model):
    cname = models.CharField(...)

现有FilterSet代码

class EmployeeFilter(filters.FilterSet):
    full_name = filters.CharFilter(field_name="full_name", lookup_expr='icontains')

    class Meta:
        model = Employee
        fields = ['full_name']

解决方案

要实现跨关联模型的过滤,只需在EmployeeFilter中添加对应关联路径的过滤器字段即可,具体修改如下:

  1. 新增一个过滤器字段,指定field_name为ORM查询里的关联链companyrecord__company__cname,同时设置lookup_expr='icontains'匹配模糊查询逻辑。
  2. 将这个新字段加入Meta类的fields列表。

修改后的完整FilterSet代码:

class EmployeeFilter(filters.FilterSet):
    full_name = filters.CharFilter(field_name="full_name", lookup_expr='icontains')
    # 新增公司名称过滤字段
    company_name = filters.CharFilter(field_name="companyrecord__company__cname", lookup_expr='icontains')

    class Meta:
        model = Employee
        fields = ['full_name', 'company_name']

现在你可以通过company_name查询参数实现和原ORM语句一致的过滤效果,比如请求/employees/?company_name=ompanyname就能返回符合条件的员工数据。

内容的提问来源于stack exchange,提问作者daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:06:15