Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Annotate with django-graphene and filters

I would like to sum a field in my resolver of django-graphene using django-filter. Typically my resolvers would look like:

my_model = DjangoFilterConnectionField(
        MyModelNode,
        filterset_class=MyModelFilter)

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

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

Which works fine.
However, I would like to provide a custom queryset to the model filter so that I can perform aggregations on fields. I'm trying to do something like this:

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

Inspecting the raw SQL in GraphiQL, it looks correct. However, the error message I receive from GraphQL is

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

This is the correct result, but I'm unsure why GraphQL is getting this object from django-graphene. How can I provide a custom queryset and make this work?

like image 437
duffn Avatar asked Sep 15 '17 14:09

duffn


1 Answers

For queryset to work you need to get instance of the model which you can get using

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

and then you can try further actions.

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

still error

Try ASSET UNION and see if that works else you can also try DjangoConnectionField from relay.connection.

like image 188
Astik Anand Avatar answered Sep 25 '22 17:09

Astik Anand