用django-graphene和过滤器注释

duf*_*ffn 11 python django graphql

我想用django-filter在我的django-graphene解析器中总结一个字段.通常我的解析器看起来像:

my_model = DjangoFilterConnectionField(
        MyModelNode,
        filterset_class=MyModelFilter)

def my_resolver(self, args, context, info):

    return MyModelFilter(
        data=format_query_args(args),
        queryset=self).qs
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.
但是,我想为模型过滤器提供自定义查询集,以便我可以对字段执行聚合.我正在尝试做这样的事情:

def my_resolver(self, args, context, info):
    queryset = MyModel.objects.values(
        'customer_id').annotate(
        cost_amt=Sum('cost_amt', output_field=FloatField()))

    return MyModelFilter(
        data=format_query_args(args),
        queryset=queryset).qs
Run Code Online (Sandbox Code Playgroud)

检查GraphiQL中的原始SQL,它看起来是正确的.但是,我从GraphQL收到的错误消息是

"message": "Received incompatible instance \"{'cost_amt': 260.36, 'customer_id': 300968697}\"."
Run Code Online (Sandbox Code Playgroud)

这是正确的结果,但我不确定为什么GraphQL从django-graphene获取此对象.如何提供自定义查询集并使其工作?

小智 1

看起来 django-graphene 正在等待模型实例的 QuerySet,当您调用.values()QuerySet 时,您将返回字典的查询集,因此Received incompatible instance.

您也许可以使用子查询表达式,或者执行一些rawsql 查询,这两者都会返回模型实例,这实际上取决于您在模型上设置的关系类型。

看起来从关系的另一端(客户端)执行此注释可能更容易,因为您不需要使用它,.values()但它可能无法满足您的需要。