使用Djangogene和过滤器进行注释

2024-10-16 17:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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

效果很好。
但是,我想为模型过滤器提供一个自定义的queryset,这样我就可以对字段执行聚合。我正试着做这样的事情:

^{pr2}$

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

"message": "Received incompatible instance \"{'cost_amt': 260.36, 'customer_id': 300968697}\"."

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


Tags: djangoself解析器modelmyargsfiltergraphql
3条回答

看起来django graphene需要一个模型实例的查询集,当您在一个查询集上调用.values()时,您将得到一个字典的查询集,因此Received incompatible instance。在

您可以使用subquery expressions,或者执行一些rawsql queries这两种方法都将返回模型实例,这实际上取决于您在模型上设置的关系类型。在

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

为了让queryset工作,您需要获取可以使用的模型实例

queryset = MyModel.objects.annotate(cost_amt=Sum('cost_amt', output_field=FloatField()))

然后你可以尝试进一步的行动。在

^{pr2}$

still error

试试ASSET UNION,看看是否有效,否则您也可以从relay.connection尝试DjangoConnectionField。在

我假设您的问题是因为^{}返回的是字典而不是模型实例。在

您可以尝试避免使用.values(),正如您在aggregation cheat sheetGenerate aggregates for each item in a QuerySet部分的最后两个示例中看到的那样:

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

return MyModelFilter(
    data=format_query_args(args),
    queryset=queryset).qs   

但请记住,您必须相应地调整“前端”/接收器,因为现在解析器将返回查询集而不是字典。在

相关问题 更多 >