1
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
          }
        }
4

1 回答 1

0

中继规范和实现要求您支持node查询,除了您的查询根(通常viewer

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

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

于 2017-01-13T08:27:24.030 回答