首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-石墨烯和过滤器进行注释

使用django-石墨烯和过滤器进行注释
EN

Stack Overflow用户
提问于 2017-09-15 22:00:14
回答 3查看 2.5K关注 0票数 11

我想用django-filter对我的django-graphene解析器中的一个字段求和。通常,我的解析器看起来像这样:

代码语言:javascript
复制
my_model = DjangoFilterConnectionField(
        MyModelNode,
        filterset_class=MyModelFilter)

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

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

它工作得很好。

但是,我想为模型过滤器提供一个自定义查询集,这样我就可以在字段上执行聚合。我正在尝试这样做:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
"message": "Received incompatible instance \"{'cost_amt': 260.36, 'customer_id': 300968697}\"."

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

EN

回答 3

Stack Overflow用户

发布于 2017-09-26 20:20:51

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

代码语言:javascript
复制
queryset = MyModel.objects.annotate(cost_amt=Sum('cost_amt', output_field=FloatField()))

然后您可以尝试进一步的操作。

代码语言:javascript
复制
return MyModelFilter(data=format_query_args(args),queryset=queryset).qs

静止错误

试试 ASSET UNION,看看是否还能用,你也可以试试relay.connectionDjangoConnectionField

票数 2
EN

Stack Overflow用户

发布于 2017-09-20 03:54:32

看起来django-graphene需要一个模型实例的QuerySet,当你在一个QuerySet上调用.values()时,你会得到一个字典的查询集,也就是Received incompatible instance

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-09-26 19:24:01

我假设您的问题是因为.values()返回的是字典而不是模型实例。

您可以尝试避免使用.values(),因为您可以在aggregation cheat sheet的最后两个示例和部分中看到:

代码语言:javascript
复制
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   

但请记住,您将不得不相应地调整您的“前端”/receiver,因为现在您的解析器将返回一个查询集而不是字典。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46241419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档