如何在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
相关产品推荐
相关产品推荐

