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过滤器:
- 首先定义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"] }
- 修改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
相关产品推荐
相关产品推荐

