リレーとフィルターを備えたグラフェン インターフェイスがあります。それはかなりうまくいきますが、order_by オプションを追加したいと思います。私のオブジェクトは次のようになります。
class FooGQLType(DjangoObjectType):
class Meta:
model = Foo
exclude_fields = ('internal_id',)
interfaces = (graphene.relay.Node,)
filter_fields = {
"id": ["exact"],
"code": ["exact", "icontains"],
}
connection_class = ExtendedConnection
class Query(graphene.ObjectType):
foo = DjangoFilterConnectionField(FooGQLType)
ExtendedConnection は関係ありませんが、次のようになります。
class ExtendedConnection(graphene.Connection):
class Meta:
abstract = True
total_count = graphene.Int()
def resolve_total_count(root, info, **kwargs):
return root.length
これにより、次のようにクエリを実行できますfoo(code_Icontains:"bar")
。グラフェンのドキュメントによると、そのために FilterSet で OrderingFilter を使用する必要があります。フィルターは自動であるはずなので、少し面倒ですが、そうすると:
class FooGQLFilter(FilterSet):
class Meta:
model = Foo
order_by = OrderingFilter(
fields=(
('code', 'code'),
('lastName', 'last_name'),
('otherNames', 'other_names'),
)
)
提供する必要があるエラーが表示されます。fields
またはexclude
:
AssertionError: Setting 'Meta.model' without either 'Meta.fields' or 'Meta.exclude' has been deprecated since 0.15.0 and is now disallowed. Add an explicit 'Meta.fields' or 'Meta.exclude' to the FooGQLFilter class.
したがって、 a を追加しfields = []
て沈黙させると、コンパイルされます。ただし、次の場合に使用します。
foo = DjangoFilterConnectionField(FooGQLType, filterset_class=FooGQLFilter)
code_Icontains
消えるような私の通常のフィルター。そこにもう一度追加できますが、ばかげています。ソースをざっと見てみると、Relay または django-filters がすでに FilterSet クラスを作成しているように見えますが (理にかなっています)、このように上書きするのは明らかに悪い考えです。
Graphene Relay でフィルタリングされたオブジェクトに orderBy フィルターを追加するにはどうすればよいですか? これはかなり簡単なはずですが、これを理解するのに苦労しています。
DjangoFilterConnectionField
また、何らかの方法で order_by を注入するaでサブクラス化する例を見てconnection_resolver
きましたが、それは orderBy パラメーターがないことを示しています。