我想用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它工作得很好。
但是,我想为模型过滤器提供一个自定义查询集,这样我就可以在字段上执行聚合。我正在尝试这样做:
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收到的错误消息是
"message": "Received incompatible instance \"{'cost_amt': 260.36, 'customer_id': 300968697}\"."这是正确的结果,但是我不确定为什么GraphQL要从django-graphene获得这个对象。如何提供自定义查询集并使其正常工作?
发布于 2017-09-26 20:20:51
要让queryset正常工作,您需要获取模型的实例,您可以使用
queryset = MyModel.objects.annotate(cost_amt=Sum('cost_amt', output_field=FloatField()))然后您可以尝试进一步的操作。
return MyModelFilter(data=format_query_args(args),queryset=queryset).qs静止错误
试试 ASSET UNION,看看是否还能用,你也可以试试relay.connection的DjangoConnectionField。
发布于 2017-09-20 03:54:32
看起来django-graphene需要一个模型实例的QuerySet,当你在一个QuerySet上调用.values()时,你会得到一个字典的查询集,也就是Received incompatible instance。
您可以使用subquery expressions,或者执行一些rawsql queries,这两者都将返回模型实例,这真的取决于您在模型上设置的关系类型。
从关系的另一端(客户端)看起来可能更容易做这个注释,因为您不需要使用.values(),但它可能无法满足您的需要。
发布于 2017-09-26 19:24:01
我假设您的问题是因为.values()返回的是字典而不是模型实例。
您可以尝试避免使用.values(),因为您可以在aggregation cheat sheet的最后两个示例和部分中看到:
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,因为现在您的解析器将返回一个查询集而不是字典。
https://stackoverflow.com/questions/46241419
复制相似问题