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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:58:46