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

如何在graphene-django多字段icontains查询中使用OR条件

Graphene Django多字段icontains查询改为OR逻辑的实现方法

默认的DjangoFilterConnectionField对多个过滤参数采用AND逻辑拼接,要实现OR逻辑可以通过以下两种方案:


方案一:重写查询resolver(灵活可控,适合临时调整逻辑)

首先导入Django的Q对象用于构建OR查询条件,然后在Query类中添加resolve_all_jobs方法手动处理过滤逻辑:

from django.db.models import Q
# 其他原有导入保持不变

class Query(graphene.ObjectType):
    job = relay.Node.Field(JobPostNode)
    all_jobs = DjangoFilterConnectionField(JobPostNode)

    def resolve_all_jobs(self, info, **kwargs):
        queryset = JobPost.objects.all()
        or_filters = Q()
        # 提取需要走OR逻辑的icontains参数
        if "job_Icontains" in kwargs:
            or_filters |= Q(job__icontains=kwargs.pop("job_Icontains"))
        if "company_Icontains" in kwargs:
            or_filters |= Q(company__icontains=kwargs.pop("company_Icontains"))
        # 其他字段的icontains可以按照上面的格式自行添加
        # 应用OR条件
        if or_filters:
            queryset = queryset.filter(or_filters)
        # 剩余的其他过滤参数(如exact、istartswith等)继续走默认AND逻辑
        return queryset.filter(**kwargs)

方案二:自定义FilterSet(适合标准化复用的过滤逻辑)

如果你需要在多个地方复用这套OR过滤规则,可以自定义django-filter的FilterSet类:

import django_filters
from django.db.models import Q
# 其他原有导入保持不变

class JobPostFilter(django_filters.FilterSet):
    class Meta:
        model = JobPost
        fields = {
            'company': ['exact', 'istartswith'],
            'job': ['exact', 'istartswith'],
            'category': ['exact', 'icontains', 'istartswith'],
            "description": ['exact', 'icontains', 'istartswith'],
        }

    def filter_queryset(self, queryset):
        or_conditions = Q()
        # 处理OR逻辑的参数
        if "job_Icontains" in self.data:
            or_conditions |= Q(job__icontains=self.data["job_Icontains"])
        if "company_Icontains" in self.data:
            or_conditions |= Q(company__icontains=self.data["company_Icontains"])
        if or_conditions:
            queryset = queryset.filter(or_conditions)
        # 剩余参数走默认过滤逻辑
        return super().filter_queryset(queryset)

之后在JobPostNode中指定使用自定义的FilterSet:

class JobPostNode(DjangoObjectType):
    class Meta:
        model = JobPost
        filterset_class = JobPostFilter
        interfaces = (relay.Node,)

效果验证

配置完成后执行你提供的GraphQL查询,即可返回job字段含t 或 company字段含v的结果,符合预期需求。

内容的提问来源于stack exchange,提问作者Arka-cell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 11:27:00