我有一个带有继电器和过滤器的石墨烯接口。它工作得很好,但我想添加 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")
. 根据Graphene 文档,我应该为此在 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.
因此,如果我添加 afields = []
使其静音,它会编译。但是,当我在以下情况下使用它时:
foo = DjangoFilterConnectionField(FooGQLType, filterset_class=FooGQLFilter)
我的常规过滤器如code_Icontains
消失。我可以在那里再次添加它们,但这很愚蠢。快速查看源代码,看起来 Relay 或 django-filters 已经创建了一个 FilterSet 类(有意义),并且以这种方式覆盖它显然是一个糟糕的主意。
如何在我的 Graphene Relay 过滤对象上添加 orderBy 过滤器?我觉得这应该很简单,但我正在努力解决这个问题。
我还看到了使用 a 以某种方式注入 order_by 的子类化示例DjangoFilterConnectionField
,connection_resolver
但这告诉我没有 orderBy 参数。