2016-12-28 12 views
0
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を使用しようとしています。しかし、私は少し混乱しています。リレーを使用して両方のクエリをサポートできますか?リアルを実装するとき、私は2番目のものだけをサポートしますか?GraphQL +リレー+グラフェン

グローバルI/Fをデータベースのプライマリキーに変換する必要がありますか?

グラフQL:

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

リレー:

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

答えて

0

リレーの仕様と実装nodeクエリをサポートするためにあなたを必要とするだけであなたのクエリのルート(通常はviewer

リレーはフィールドをフェッチする必要があるときに内部でnodeを使用します特定のノード ノードに関係なく、実際にproductというクエリが必要な場合、リレー・コンテナの1つから自分自身を呼び出します。

グローバルIDは、はい - 常にグローバルIDからプライマリキーに変換する必要があります。 より正確に言えば、グローバルIDから、照会しているObjectTypeの後ろにあるDBの内部キー表現に変換する必要があります。 グローバルIDには、取得しようとしているObjectTypeの型情報が含まれています。この情報がなければ、フレームワークはidを送信するObjectTypeを知らないので、フェッチを実行できます。