GraphQL +继电器+石墨烯

时间:2016-12-28 23:39:16

标签: graphql relay graphene-python

class Product(SQLAlchemyObjectType):
    class Meta:
        model = ProductModel
        interfaces = (relay.Node, )

    @classmethod
    def get_node(cls, id, context, info):
        #must implement to relay
        pass


class Query(graphene.ObjectType):
    product = graphene.Field(Product, id=graphene.String())
    node = relay.Node.Field()

    def resolve_product(self, args, context, info):
        session =  context['session']
        id_ = from_global_id(args['id'])[1]
        p = session.query(ProductModel).filter(ProductModel.id == id_).first()
        return p

我正在尝试使用GraphQL + Relay + Grephene。但我有点困惑。我可以使用中继支持两个查询吗?或者在实施时,我只支持第二个?

我是否始终需要将globalId转换为数据库主键?

图表QL:

{
    product (id: "XYZ"){
       id
       title
    }
}

继电器:

{
        node(id: "XYZ") {
          id
          ... on product {
            title
          }
        }

1 个答案:

答案 0 :(得分:0)

继电器规范和实施要求您支持node查询以及查询根(通常为viewer

当需要获取特定节点的字段时,Relay将在内部使用node。 无论节点如何,如果您真的想要product查询并自己从其中一个中继容器中调用它。

至于全局ID,是的 - 您总是需要从全局ID转换为主键。 但更确切地说 - 您总是需要从全局ID转换为您正在查询的ObjectType后面的任何数据库的内部键表示。 全局id包含类型信息 - 我们尝试获取的ObjectType。如果没有该信息,框架将不知道将ID发送到哪个ObjectType,以便它可以进行提取。