2017-03-27 9 views
0

Graphene Djangoをreact-router-relayで使用する方法を理解するのに本当に問題があります。のは、私は私のDjangoのサーバー上GraphiQLコンソールから、次のGraphQLクエリの罰金を使用することができましょう:Graphene Djangoとreact-router-relay

query { 
    allThreads { 
    edges { 
     node { 
     id 
     } 
    } 
    } 
} 

これはおそらくリレーがルートクエリの接続をサポートしていないため使用commmon viewerラッパーへのグラフェンの代替手段です。ですから、私はallThreadsが本当に(ThreadNodeConnection型の)ノードであり、私が照会できるエッジ接続を持っていることを理解しています。

問題は、私はRelayでこれをどのように使用するか、特にreact-router-relayを理解できません。

fragments: { 
     store:() => Relay.QL` 
     fragment on Query { 
      allThreads (first:300) { 
      edges { 
       node { 
       // child's fragment included here 
       } 
      }, 
      } 
     } 
     `, 
    }, 

のWebPACKの私のライブスキーマに対してチェックこの、それが好き:私は(他の場所で子スレッドコンポーネントとの)このようなことにフラグメントと反応す​​るビューを持っています。それから私は、ルータのための私のindex.jsに次のように作成します。私は私が間違っViewerQueriesをやって把握するため

const ViewerQueries = { 
    store:() => Relay.QL`query { allThreads(first:300) }` 
}; 

ReactDOM.render(
    <Router 
    forceFetch 
    environment={Relay.Store} 
    render={applyRouterMiddleware(useRelay)} 
    history={browserHistory} 
    > 
    <Route path='/' component={ThreadList} queries={ViewerQueries} /> 
    </Router> 
    , document.getElementById('container') 
) 

は、すでに私はちょっとわからない感じだけど、誰もが対応するために、これを使用しているため、それは知っているのは難しいですそれらのGraphQL接続にはviewerラッパーが入っていますが、Grapheneは各接続ごとに異なるラッパーを持っていますので、これは私の単一ルートでしか機能しないかもしれませんが、今は大丈夫です。 Webpackはそれを再びスキーマに対して好きです。私はページをロードするときしかし、私は「悪い要求」とエラーが出ること:

「フラグメントF1は、タイプのクエリでなることはありませんタイプ ThreadNodeConnectionのオブジェクトとして、ここで普及することはできません」

Graphene Djangoがどのようにスキーマを構築するか、またはGraphQLフラグメントをどのように書くべきか、あるいはルートクエリをどのように書くべきかについて、何かをはっきりと理解していないからです。問題は、これらのうちのどれが間違っているかわからず、これらの特定の技術の組み合わせを使用している人の周りにはリソースがないようです。

完全を期すために、私のグラフェンDjangoのスキーマのセットアップが(少し簡略化)である:

プロジェクト/スレッド/ schema.py:

class ThreadNode(DjangoObjectType): 
    class Meta: 
     model = Thread 
     interfaces = (relay.Node,) 

... 

class Query(graphene.AbstractType): 
    all_threads = DjangoFilterConnectionField(ThreadNode) 
    thread = relay.Node.Field(ThreadNode, id=graphene.Int()) 

    def resolve_all_threads(self, args, context, info): 
     return Thread.objects.select_related('author__profile').all() 

    def resolve_thread(self, args, context, info): 
     id = args.get('id') 

     if id is not None: 
      return Thread.objects.get(pk=id) 

     return None 

プロジェクト/ schema.py:

class Query(project.threads.schema.Query, graphene.ObjectType): 
    pass 

schema = graphene.Schema(query=Query) 

誰もが以前にこの特定の組み合わせを使用し、アドバイスがあれば、それは素晴らしいだろう。

+0

これは実際にはグラフェンではありません。あなたがしようとしているのは、接続フィールドをルートフィールドとして使用することです。これはリレー1ではサポートされていませんが、リレー2にある必要があります。完全な説明はここにあります:https://github.com/facebook/relay/issues/112 –

+0

私はそうではないと思います。 。 Grapheneは、すべての接続をラップすることで接続時の問題を解決します。そのため、接続はエッジ接続が使用可能なノードになります。 –

+0

"fragment on Query"と気付きました。エラーが示唆しているようにThreadNodeConnectionでフラグメントを試しましたか? –

答えて

0

私はこの同じ問題を持っていたし、リレー1がルートクエリとして接続をサポートしていませんので、長い検索した後、私は最終的にこの答え https://github.com/facebook/relay/issues/1558#issuecomment-297010663

を見つけました。クエリをラップするノードインタフェースとしてビューアを広告する必要があります。 したがって、サーバーのメインクエリ(プロジェクト/スキーマ。

query { 
    viewer{ 
    allThreads(first:10) { 
    edges { 
     node { 
     id 
     } 
    } 
    } 
} 
} 

は、クライアント側では、あなたがこのようなあなたのコンテナを作成することができます:

export default Relay.createContainer(ThreadList, { 
    fragments: { 
     viewer:() => Relay.QL` 
    fragment on Query { 
      id 
      allThreads(first:10){ 
      edges{ 
       node{ 
       id 
       } 
      } 
      } 
     } 
    `, 
    }, 
}); 
あなたはこのようなクエリをフォーマットすることができgraphiqlで今

class Query(project.threads.schema.Query, graphene.ObjectType): 
    viewer = graphene.Field(lambda: Query) 
    id = graphene.ID(required=True) 

    def resolve_viewer(self, args, context, info): 
    return info.parent_type 

    def resolve_id(self, args, context, info): 
     return 1 

    class Meta: 
     interfaces = (graphene.relay.Node,) 

:PY)は、次のコードを追加する必要があります

私はこれがあなたを助けることを願っています

関連する問題