3

リレーとフィルターを備えたグラフェン インターフェイスがあります。それはかなりうまくいきますが、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 パラメーターがないことを示しています。

4

3 に答える 3

5
于 2020-05-01T13:21:38.120 に答える