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

Django Graphene GraphQL ManyToMany字段in过滤报错问题求助

问题原因

你遇到的报错核心是旧版本依赖的特性冲突:你使用的django-filter==1.0.4中,默认的in过滤器预期输入是逗号分隔的单个字符串,会内部调用split()方法切割为列表,而你传了数组类型的参数,因此触发'list' object has no attribute 'split'错误。

解决方案

有两种可选方案,无需升级依赖即可实现需求:

方案1:仅调整GraphQL查询语句(无需改后端代码)

直接将多个团队ID用逗号拼接为单个字符串作为参数,不要包裹数组括号,ID之间不要留空格,查询语句调整为:

query getAllAgents{
  allAgents(teams_In:"6d6d1d4d-c1b4-485a-9269-f7e9d06d862a,7e082abf-584b-4858-b510-4c71fc295e2f") {
    id
    name
    teams {
      id
      name
    }
  }
}

方案2:自定义过滤器支持数组传参(符合GraphQL标准写法)

如果要支持数组格式的传参,需要自定义FilterSet替换默认的in过滤器:

  1. 首先定义Agent专属的FilterSet:
from django_filters import FilterSet, ModelMultipleChoiceFilter
from .models import Agent, Team

class AgentFilterSet(FilterSet):
    teams__in = ModelMultipleChoiceFilter(
        field_name='teams',
        queryset=Team.objects.all(),
        to_field_name='id',
        lookup_expr='in'
    )
    
    class Meta:
        model = Agent
        fields = {
            "teams": ["in"]
        }
  1. 修改AgentNode配置,指定使用自定义的FilterSet:
class AgentNode(DjangoObjectType):
    class Meta:
        model = Agent
        filterset_class = AgentFilterSet

修改完成后就可以使用数组格式传参:

query getAllAgents{
  allAgents(teams_In:["6d6d1d4d-c1b4-485a-9269-f7e9d06d862a", "7e082abf-584b-4858-b510-4c71fc295e2f"]) {
    id
    name
    teams {
      id
      name
    }
  }
}
注意事项

两种方案执行查询时,框架默认会自动添加distinct()去重,和你预期的Django原生查询逻辑一致,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:54:01