pythongraphqlgraphene-pythongqlgraphene-django

How to declare variables in a GraphqQL query using the gql client?


I'm new with GraphQL schemas and I would like to do a mutation using the gql client. The query below works like a charme in the graphql web interface after replacing the 5 variables with the corresponding strings and integers.

But when I put a $ before every variables in the query, as mentionned in the documentation, it throws an error saying Variable '$w' is not defined by operation 'createMutation'.

What am'I missing ?

transport = AIOHTTPTransport(url="http://x.x.x.x:8000/graphql")

client = Client(transport=transport, fetch_schema_from_transport=True)

query = gql(
    """
        mutation createMutation {
          createTarget(targetData: {weight: $w, dt: $dt, 
            exchangeId: $exchangeId, 
            strategyId: $strategyId,
            marketId:$marketId
          }) {
            target {
              dt,
              weight,
              market,
              exchange,
              strategy
            }
          }
        }
"""
)

params = {"w": self.weight,
          "dt": self.dt,
          "exchangeId": self.exchange.pk,
          "strategyId": self.strategy.pk,
          "marketId": self.market.pk
          }

result = client.execute(query, variable_values=params)

When I remove the $ it says Float cannot represent non numeric value: w.

And this is how the graphene code looks like at the server side :

class TargetInput(graphene.InputObjectType):
    weight = graphene.Float()
    dt = graphene.DateTime()
    strategy_id = graphene.Int()
    exchange_id = graphene.Int()
    market_id = graphene.Int()


class CreateTarget(graphene.Mutation):
    class Arguments:
        target_data = TargetInput(required=True)

    target = graphene.Field(CustomObject)

    @staticmethod
    def mutate(root, info, target_data):
        target = Target.objects.create(**target_data)
        return CreateTarget(target=target)


class Mutation(graphene.ObjectType):
    create_target = CreateTarget.Field()


schema = graphene.Schema(query=Query, mutation=Mutation)

There is also another question related to gql variables but it doesn't solve my problem.


Solution

  • I have found the answer to my own question. When using variables it's necessary to declare each of them between ( and ) at the beggining of the query, as stipulated here.

    So in my case the correct query was:

    query = gql(
        """
            mutation createMutation ($w: Float, $dt: DateTime, $exchangeId: Int, $strategyId: Int, $marketId: Int){
              createTarget(targetData: {weight: $w, dt: $dt, 
                exchangeId: $exchangeId, 
                strategyId: $strategyId,
                marketId: $marketId
              }) {
                target {
                  dt
                }
              }
            }
    """
    )