есть ли возможность передать массив объектов (json) в качестве поля ввода для мутации? графеновый питон

Я пытаюсь передать поле json в качестве входных данных для моей мутации graphql. Я пытался и искал, но просто не повезло. Я могу передать массив в порядке, я знаю, что определение graphene.List(graphene.String) будет работать для передачи массива строк.

Я подумал, что есть тип с именем graphene.JSONstring(), который, как я думал, будет работать, если я буду использовать его с graphene.List(graphene.JSONstring), но не повезло, все еще получаю ошибки, говорящие о том, что тип неправильный.

У меня что-то подобное во время мутации

    mutation {
        create(data:{
                field1: [
                    {
                        "first": "first",
                        "last": "last"
                    },
                    {
                        "first":"first1",
                        "last":"last1"
                    }
                ]
        })
    }

как для входного класса

class NameInput(graphene.InputObjectType):
    # please ignore the same field names, just listing what I have tried
    field1 = graphene.JSONString()  
    field1 = graphene.List(graphene.JSONString)
    field1 = graphene.List(graphene.String)

Кто-нибудь знает, как это будет работать?

заранее спасибо


person Tsuna    schedule 04.01.2018    source источник


Ответы (3)


Похоже, вы пытаетесь иметь вложенные объекты ввода. К сожалению, я никогда не использовал графен, но, возможно, я могу ответить с точки зрения спецификации GraphQL, а затем сделать обоснованное предположение о коде графена:

type Mutation {
  create(data: NameInput): Boolean # <- Please don't return just Boolean
}

input NameInput {
  field1: FistLastInput[]
}

input FirstLastInput {
  first: String!
  last: String!
}

Это означает, что вам понадобятся два объекта ввода для описания структуры вашего ввода. Создайте новый класс для вашего объекта, который принимает поля first и last:

class FirstLastInput(graphene.InputObjectType):
    first = graphene.NonNull(graphene.String)
    last = graphene.NonNull(graphene.String)

Теперь мы можем использовать входной объект в нашем исходном запросе:

class NameInput(graphene.InputObjectType):
    field1 = graphene.List(FirstLastInput)
person Herku    schedule 04.01.2018

Вы можете попробовать так:

class NameInput(graphene.InputObjectType):
    field1 = graphene.JSONString()

А потом:

mutation {
    create(data:{
            field1: "[
                {
                    \"first\": \"first\",
                    \"last\": \"last\"
                },
                {
                    \"first\":\"first1\",
                    \"last\":\"last1\"
                }
            ]"
    })
}

Так что в основном отправьте json как строку.

person noName    schedule 28.03.2019

Графен предоставляет тип GenericScalar. Вы можете использовать его для ввода/вывода универсальных типов, таких как int, str, dict, list и т. д.

from graphene import InputObjectType, Mutation
from graphene.types.generic import GenericScalar

class InputObject(InputObjectType):
    field1 = GenericScalar()

class Create(Mutation):
    class Arguments:
        data = InputObject()

    def mutate(root, info, data):
        # do something with data.field1

Тогда ваш ввод будет выглядеть так

mutation {
  create (
    data: {
      field1: [
        {
          first: "first",
          last: "last"
        },
        {
          first: "first1",
          last: "last1"
        }
      ]
    }
  )
}

Обратите внимание, что field1 может принимать любой общий ввод, поэтому обязательно проверьте его.

Кроме того, при использовании поля GenericScalar для вывода (запроса) вы не сможете запрашивать его подполя. Но вы можете написать преобразователь для этого поля, чтобы убедиться, что возвращаются только определенные подполя.

Вот ссылка на соответствующую проблему GitHub.

person mrpandey    schedule 02.04.2021