art1415926535 / graphene-sqlalchemy-filter

Filters for Graphene SQLAlchemy integration

Home Page:https://pypi.org/project/graphene-sqlalchemy-filter/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

graphene-sqlalchemy-filter not working in nested graphQL query.

bhavnish07 opened this issue · comments

I am having issues in implementing graphene-sqlalchemy-filter in nested graphQL query. It is working as expected with normal graphQL query but when implemented in nested query the filter seems to not work.

I have two models:

  • Group model
  • Task model
class GroupModel(Base):
    __tablename__ = "groups"
    id = Column(Integer, primary_key=True)
    name = Column(Text, index=True)
    tasks = relationship(
        "TaskModel",
        backref=backref("circle", lazy='bulk'),
        lazy='bulk',
        cascade="all, delete-orphan",
    )
class TaskModel(Base):
    __tablename__ = "tasks"
    id = Column(Integer, primary_key=True)
    group_id = Column(Integer, ForeignKey("groups.id"), nullable=False)
    title = Column(Text, nullable=False)
    done = Column(Boolean, nullable=False, index=True)
    categories = Column(
        Text,
        default="General",
    )

#The code for filtering :

class GroupTodoFilter(FilterSet):
    class Meta:
        model = TaskModel
        fields = {
            'title': ['eq'],
            'done': ['eq'],
            'categories': ['eq'],
        }


class GroupFilterableConnectionField(FilterableConnectionField):
    filters = {TaskModel: GroupTaskFilter()}


class TaskFilter(SQLAlchemyObjectType):
    class Meta:
        model = TaskModel
        interfaces = (relay.Node, )
        connection_field_factory = GroupFilterableConnectionField.factory


class TaskFilterConnection_1(Connection):
    class Meta:
        node = TaskFilter


class GroupFilterNode(SQLAlchemyObjectType):
    class Meta:
        model = GroupModel
        interfaces = (relay.Node, )
        connection_field_factory = GroupFilterableConnectionField.factory


class GroupFilterConnection(Connection):
    class Meta:
        node = GroupFilterNode

`

in schema:

all_task = GroupFilterableConnectionField(TaskFilterConnection_1)
  all_group_filters = GroupFilterableConnectionField(
     GroupFilterConnection)
filter_group = relay.Node.Field(GroupFilterNode)

Queries

query{
  allGroupFilters{
    edges{
      node{
        tasks(filters:{done:true}){
          edges{
            node{
              id
              groupId
              categories
              done
              title
            }
          }
        }
      }
    }
  }
}

query{
  allTask (filters:{done:false}){
    edges{
      node{
        id
        title
        groupId
        categories
        done
      }
    }
  }
}
query($id: ID!) {
  filterGroup (id: $id) {
    tasks (filters:
       {categories:"Health"}
    )
      {
      edges {
        node {
          id
          group {
            id
          }
          title
          done
          categories
        }
      }
    }
  }
}`

Task query is working alright but filterGroup and allFilterGroup query have no filtering affect.

Try this code:

class GroupFilter(FilterSet):
    class Meta:
        model = GroupModel
        fields = {
            # some fields
        }


class TaskFilter(FilterSet):
    class Meta:
        model = TaskModel
        fields = {
            # some fields
        }


class CustomFilterableConnectionField(FilterableConnectionField):
    filters = {
        TaskModel: TaskFilter(), 
        GroupModel: GroupFilter()
    }


class TaskNode(SQLAlchemyObjectType):
    class Meta:
        model = TaskModel
        interfaces = (Node,)
        connection_field_factory = CustomFilterableConnectionField.factory


class GroupNode(SQLAlchemyObjectType):
    class Meta:
        model = GroupModel
        interfaces = (Node,)
        connection_field_factory = CustomFilterableConnectionField.factory


class TaskConnection(Connection):
    class Meta:
        node = TaskNode


class GroupConnection:
    class Meta:
        node = GroupNode


class Query(ObjectType):
    all_tasks = CustomFilterableConnectionField(TaskConnection)
    all_groups = CustomFilterableConnectionField(GroupConnection)

Hi!
We actually want to do query on groups and filter tasks fields from it (groups and tasks are related in one to many relationship) . Others queries were just for testing the filter.

  • Filters are working for groups and tasks independently but when we try to have a filter on groups and try to filter tasks field from it. It seems to not work.

Filters are not working for the below query:

query($id: ID!) {
  filterGroup (id: $id) {
    tasks  (filters:
       { categories:"Health"}
    )
      {
      edges {
        node {
          id
          group {
            id
          }
          title
          done
          categories
        }
      }
    }
  }
}

It seems like nested filters are not working.

commented

Hi @bhavnish07! I have reproduced your example here https://github.com/art1415926535/graphene-sqlalchemy-filter/tree/issue_35/examples/groups_and_tasks.

Everything seems to work fine.

image
image

Nice effort @art1415926535 , thank you in the name of all interested in this module!