简体   繁体   中英

search/filter with list of string graphene-django

I am looking to search for list of different characters/string using graphene-django with single search query run.

      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

Here the candidateName, candidateSkills, candidateEmail are in Candidate class with models.CharField

With a single string/character search i am getting correct output. But it fails with list of sting/characters.

Edited: Adding json sample:

[
    {
        "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"]
        }
        
    },
    {
        "model": "api.candidate",
        "pk": 3,
        "fields":{
            "candidateName" : "Smith",
            "candidateEmail" : "Smith@gmail.com",
            "candidateSkills" : ["python"]           
        }
      
    }
]

If query goes in:

query{
        candidateInfo(search: "python")
        {

            candidateName
            candidateEmail
              
        }

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

Also if query is

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

            candidateName
            candidateEmail
              
        }

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

Adding models of candidate

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

You can run a for loop as such:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM