搜索/过滤字符串graphene-django列表

问题描述

我正在寻找使用 graphene-django 和单个搜索查询运行来搜索不同字符/字符串的列表。

      class Query(graphene.ObjectType):
          candidateInfo = graphene.List(CandidateType,search=graphene.String(),first=graphene.Int(),skip=graphene.Int(),last=graphene.Int(),)

          def resolve_candidateInfo(self,info,search=None,first=None,last=None,skip=None,**kwargs):
              qs = Candidate.objects.all()
                  if search:
                  filter = (
                      Q(candidateName__icontains=search)|
                      Q(candidateEmail__icontains=search)|
                      Q(candidateSkills__icontains=search)
                  )
                  qs = qs.filter(filter)
              return qs

这里的CandidateName、CandidateSkills、CandidateEmail 都在带有models.CharField 的Candidate 类中

通过单个字符串/字符搜索,我得到了正确的输出。但它因刺痛/字符列表而失败。

编辑:添加json示例:

[
    {
        "model": "api.candidate","pk": 1,"fields": {
            "candidateName" : "Jack","candidateEmail" : "Jack@gmail.com","candidateSkills" : ["machine learning","Artificial Intelligence"]
        }
        
    },{
        "model": "api.candidate","pk": 2,"fields":{
            "candidateName" : "John","candidateEmail" : "John@gmail.com","candidateSkills" : ["python","machine learning"]
        }
        
    },"pk": 3,"fields":{
            "candidateName" : "Smith","candidateEmail" : "Smith@gmail.com","candidateSkills" : ["python"]           
        }
      
    }
]

如果查询进入:

query{
        candidateInfo(search: "python")
        {

            candidateName
            candidateEmail
              
        }

}
# output must contain data of John and Smith (from sample json)

如果查询

query{
        candidateInfo(search: ["python","artificial intelligence"])
        {

            candidateName
            candidateEmail
              
        }

}
#output must contain data of Jack,John and smith

添加候选模型

from django.db import models

class Candidate(models.Model):
    candidateName = models.CharField(max_length=100)
    candidateEmail = models.CharField(max_length=100)
    candidateSkills = models.CharField(max_length=100)


    def __str__(self):
        return self.candidateSkills

解决方法

您可以像这样运行 for 循环:

qs = Candidate.objects.all()
    if search:
        if type(search) == list:
            qs_l = []
            for search_item in search:
                filter = (
                    Q(candidateName__icontains=search_item)|
                    Q(candidateEmail__icontains=search_item)|
                    Q(candidateSkills__icontains=search_item)
                )
                qs_l.append(qs.filter(filter))
            qs = qs_l
        else:
            filter = (
                Q(candidateName__icontains=search)|
                Q(candidateEmail__icontains=search)|
                Q(candidateSkills__icontains=search)
            )
            qs = qs.filter(filter)
return qs