【发布时间】:2019-12-20 01:16:14
【问题描述】:
我有一个带有中继和过滤器的石墨烯接口。它工作得很好,但我想添加 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") 一样查询。
根据the Graphene documentation,我应该为此在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.
因此,如果我添加 fields = [] 以使其静音,它会编译。
但是,当我使用它时:
foo = DjangoFilterConnectionField(FooGQLType, filterset_class=FooGQLFilter)
我的常规过滤器(例如 code_Icontains)消失了。我可以在那里再次添加它们,但这很愚蠢。快速查看源代码,看起来 Relay 或 django-filters 已经创建了一个 FilterSet 类(有道理),以这种方式覆盖它显然是一个糟糕的主意。
如何在我的 Graphene Relay 过滤对象上添加 orderBy 过滤器?我觉得这应该很简单,但我正在努力解决这个问题。
我还看到了将 DjangoFilterConnectionField 子类化为 connection_resolver 的示例,它以某种方式注入 order_by ,但告诉我没有 orderBy 参数。
【问题讨论】:
-
如果在
Meta中设置fields = '__all__'会怎样? -
fields = '__all__'实际上使用默认过滤器,因此code_Icontains不存在,只有code。如果我将filter_fields移动到FilterSet字段并设置filter_fields = FooGQLFilter._meta.fields,则过滤有效,但order_by 不再有效。在这种情况下,我看不到如何将 order_by 添加到其中...
标签: django graphene-python graphene-django