如何在Django REST Framework中实现Task模型多字段过滤?
Django REST Framework 多字段过滤
我常常用这种自定义FilterSet的方式处理DRF中外键字段的ID过滤需求,下面是针对Task模型的完整实现方案,能同时对employee_owner和employee_doer两个外键的ID进行过滤:
模型类
首先定义Task模型,包含两个指向Employee模型的外键关联:
from django.db import models class Task(models.Model): employee_owner = models.ForeignKey(Employee, on_delete=models.CASCADE) employee_doer = models.ForeignKey(Employee, on_delete=models.CASCADE)
过滤器类
接下来自定义FilterSet,创建owner_id和doer_id两个过滤字段,分别映射到对应外键的id属性:
from django_filters import FilterSet, NumberFilter from .models import Task class TaskFilter(FilterSet): owner_id = NumberFilter(field_name='employee_owner__id') doer_id = NumberFilter(field_name='employee_doer__id') class Meta: model = Task fields = ['owner_id', 'doer_id']
注:这里用field_name替代了旧版的name参数,更符合django-filter的最新规范
视图类
在ModelViewSet中指定我们自定义的filter_class,让视图启用过滤功能:
from rest_framework import viewsets from .models import Task from .serializers import TaskSerializer from .filters import TaskFilter class TaskViewSet(viewsets.ModelViewSet): serializer_class = TaskSerializer queryset = Task.objects.all() filter_class = TaskFilter
访问端点
现在你可以通过URL参数灵活过滤任务了,举几个常用例子:
- 过滤所有属于ID为1的员工的任务:
http://localhost:8000/api/tasks/?owner_id=1 - 过滤所有由ID为2的员工执行的任务:
http://localhost:8000/api/tasks/?doer_id=2 - 同时过滤所有者和执行者:
http://localhost:8000/api/tasks/?owner_id=1&doer_id=2
这个方案通过自定义FilterSet,完美实现了对Task模型两个外键字段的ID过滤需求。
内容的提问来源于stack exchange,提问作者inmate37
相关产品推荐
相关产品推荐

