graphene graphql dictionary as a type

graphene graphql dictionary as a type


23

I’m a newbie for the graphene and I’m trying to map the following structure into a Object Type and having no success at all

{
    "details": {
        "12345": {"txt1": "9", "txt2": "0"},
        "76788": {"txt1": "6", "txt2": "7"},
    }
}

Any guidance is highly appreciated
Thanks

Share
Improve this question

2

  • some more info on what issues you're having and an example of the code where those issues arise would be helpful. We don't really have much to go on with here mate.

    – somada141

    Apr 14, 2018 at 10:16

  • github.com/graphql-python/graphene/issues/… Using GenericScalar does the job

    – danish_wani

    Mar 19, 2021 at 12:58


2 Answers
2

Reset to default


25

It is unclear what you are trying to accomplish, but (as far as I know) you should not have any arbitrary key/value names when defining a GraphQL schema. If you want to define a dictionary, it has to be be explicit. This means ‘12345’ and ‘76788’ should have keys defined for them. For instance:

class CustomDictionary(graphene.ObjectType):
    key = graphene.String()
    value = graphene.String()

Now, to accomplish a schema similar to what you ask for, you would first need to define the appropriate classes with:

# Our inner dictionary defined as an object
class InnerItem(graphene.ObjectType):
    txt1 = graphene.Int()
    txt2 = graphene.Int()

# Our outer dictionary as an object
class Dictionary(graphene.ObjectType):
    key = graphene.Int()
    value = graphene.Field(InnerItem)

Now we need a way to resolve the dictionary into these objects. Using your dictionary, here’s an example of how to do it:

class Query(graphene.ObjectType):

    details = graphene.List(Dictionary)  
    def resolve_details(self, info):
        example_dict = {
            "12345": {"txt1": "9", "txt2": "0"},
            "76788": {"txt1": "6", "txt2": "7"},
        }

        results = []        # Create a list of Dictionary objects to return

        # Now iterate through your dictionary to create objects for each item
        for key, value in example_dict.items():
            inner_item = InnerItem(value['txt1'], value['txt2'])
            dictionary = Dictionary(key, inner_item)
            results.append(dictionary)

        return results

If we query this with:

query {
  details {
    key
    value {
      txt1
      txt2
    }
  }
}

We get:

{
  "data": {
    "details": [
      {
        "key": 76788,
        "value": {
          "txt1": 6,
          "txt2": 7
        }
      },
      {
        "key": 12345,
        "value": {
          "txt1": 9,
          "txt2": 0
        }
      }
    ]
  }
}

Share
Improve this answer


6

You can now use graphene.types.generic.GenericScalar

Ref : https://github.com/graphql-python/graphene/issues/384

Share
Improve this answer

1

  • A contextual example would be really helpful.

    – pdoherty926

    32 mins ago



Leave a Reply

Your email address will not be published. Required fields are marked *