graphene-sqlalchemy icon indicating copy to clipboard operation
graphene-sqlalchemy copied to clipboard

resolver outside of the class isn't working in SQLAlchemyConnectionField

Open anisjonischkeit opened this issue 8 years ago • 3 comments

I've been trying to get this to work for some time and haven't been able to figure it out. I am trying to use a resolver outside of a class using an SQLAlchemyConnectionField. The resolver is called when it is in the class however not when it is outside of the class. I have modified the flask example code to demonstrate this:

class Employee(SQLAlchemyObjectType):

    class Meta:
        model = EmployeeModel
        interfaces = (relay.Node, )

    favourite_roles = SQLAlchemyConnectionField(Role)

    def resolve_favourite_roles(self, args, context, info):
        # everyone wants to be a manager
        return Role.get_query(Role).filter_by(name='manager')

The above code works as expected. for the query:

{allEmployees {
  edges {
    node {
      name
      favouriteRoles {
        edges{
          node {
          	name
          }
        }
      }
    }
  }
}}

It returns:

{
  "data": {
    "allEmployees": {
      "edges": [
        {
          "node": {
            "name": "Peter",
            "favouriteRoles": {
              "edges": [
                {
                  "node": {
                    "name": "manager"
                  }
                }
              ]
            }
          }
        },
        {
          "node": {
            "name": "Roy",
            "favouriteRoles": {
              "edges": [
                {
                  "node": {
                    "name": "manager"
                  }
                }
              ]
            }
          }
        },
        {
          "node": {
            "name": "Tracy",
            "favouriteRoles": {
              "edges": [
                {
                  "node": {
                    "name": "manager"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

However when I have this code:

def resolve_favourite_roles(root, args, context, info):
    # everyone wants to be a manager
    return Role.get_query(Role).filter_by(name='manager')

class Employee(SQLAlchemyObjectType):

    class Meta:
        model = EmployeeModel
        interfaces = (relay.Node, )

    favourite_roles = SQLAlchemyConnectionField(Role, resolver=resolve_favourite_roles)

This is the result.

{
  "data": {
    "allEmployees": {
      "edges": [
        {
          "node": {
            "name": "Peter",
            "favouriteRoles": {
              "edges": [
                {
                  "node": {
                    "name": "manager"
                  }
                },
                {
                  "node": {
                    "name": "engineer"
                  }
                }
              ]
            }
          }
        },
        {
          "node": {
            "name": "Roy",
            "favouriteRoles": {
              "edges": [
                {
                  "node": {
                    "name": "manager"
                  }
                },
                {
                  "node": {
                    "name": "engineer"
                  }
                }
              ]
            }
          }
        },
        {
          "node": {
            "name": "Tracy",
            "favouriteRoles": {
              "edges": [
                {
                  "node": {
                    "name": "manager"
                  }
                },
                {
                  "node": {
                    "name": "engineer"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}

The resolver function is not being called when it is outside of the class.

Any help is appreciated.

anisjonischkeit avatar Jul 27 '17 07:07 anisjonischkeit

workaround:

def resolve_favourite_roles(root, args, context, info):
    return Role.get_query(Role).filter_by(name='manager')

class Employee(SQLAlchemyObjectType):

    class Meta:
        model = EmployeeModel
        interfaces = (relay.Node, )

    favourite_roles = SQLAlchemyConnectionField(Role)

    # This line makes it work
    resolve_favourite_roles = resolve_favourite_roles

anisjonischkeit avatar Jan 16 '18 00:01 anisjonischkeit

I just ran into this as well - certainly had me confused for a bit.

wichert avatar Jul 12 '18 09:07 wichert

I'm experiencing this issue as well.

leahein avatar Jan 14 '19 22:01 leahein