gpt4 book ai didi

Django Graphene Relay order_by (OrderingFilter)

转载 作者:行者123 更新时间:2023-12-01 23:36:40 25 4
gpt4 key购买 nike

我有一个带有继电器和过滤器的 Graphite 烯接口(interface)。它工作得很好,但我想添加 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'),
)
)

我收到一个需要提供的错误 fieldsexclude :
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以某种方式注入(inject) order_by 但这告诉我没有 orderBy 参数。

最佳答案

Eric 的解决方案不适用于当前的 graphene-django 版本(2.9.1)或高于 graphene-django 2.6.0 版本。

DjangoFilterConnectionField 方法在 2.7.0 版本中有所更改。
有关更多详细信息,您可以查看更改日志 here

使用 Eric 的解决方案,它会产生错误,connection_resolver() missing 1 required positional argument: 'info’
所以我修改了解决方案,它工作得很好。

from graphene_django.filter import DjangoFilterConnectionField
from graphene.utils.str_converters import to_snake_case


class OrderedDjangoFilterConnectionField(DjangoFilterConnectionField):

@classmethod
def resolve_queryset(
cls, connection, iterable, info, args, filtering_args, filterset_class
):
qs = super(DjangoFilterConnectionField, cls).resolve_queryset(
connection, iterable, info, args
)
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
qs = filterset_class(data=filter_kwargs, queryset=qs, request=info.context).qs

order = args.get('orderBy', None)
if order:
if type(order) is str:
snake_order = to_snake_case(order)
else:
snake_order = [to_snake_case(o) for o in order]
qs = qs.order_by(*snake_order)
return qs

关于Django Graphene Relay order_by (OrderingFilter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57478464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com