Skip to content

Cross search #5

@Luferov

Description

@Luferov

Sometimes, it is required to search for one variable in several fields. For example:

import graphene
from graphene_django_filter import AdvancedFilterSet

class UserFilter(AdvancedFilterSet):
    class Meta:
        model = User
        fields= {
            'last_name': ('icontains',),
            'first_name': ('icontains',),
            'sir_name': ('icontains',),
        }

Graphql query might look like this:

query SearchUser($search: String!) {
  users(
    filter: {
      cross: {
        fields: ['last_name', 'first_name', 'sir_name'],
        delimiter: ' ' # space, for example
      }
    }
  )  {
    edges {
      node {
        id
        last_name
        first_name
        sir_name
      }
    }
  }
}

Graphql query should generate sql query via django orm like this:

from django.db.models import Q

delimiter = ' '
search = 'name'
filter = Q(last_name__icontains=search) | Q(first_name__icontains=search) | Q(sir_name__icontains=search)

search = 'name1 name2'
s1, s2 = search.split(delimiter)
filter = Q(
    Q(last_name__icontains=s1) | Q(first_name__icontains=s2),
    Q(last_name__icontains=s2) | Q(first_name__icontains=s1),
    Q(last_name__icontains=s1) | Q(sir_name__icontains=s1),
    Q(last_name__icontains=s2) | Q(sir_name__icontains=s2),
    # ...
)

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions