如何用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中添加对应关联路径的过滤器字段即可,具体修改如下:
- 新增一个过滤器字段,指定
field_name为ORM查询里的关联链companyrecord__company__cname,同时设置lookup_expr='icontains'匹配模糊查询逻辑。 - 将这个新字段加入
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
相关产品推荐
相关产品推荐

