是否有可能传递对象数组(json)作为变异的输入字段?石墨烯的Python

时间:2018-01-04 01:56:49

标签: python json object graphql graphene-python

我正在尝试传递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)

有没有人知道这会如何运作?

提前致谢

3 个答案:

答案 0 :(得分:1)

好像你正在尝试嵌套输入对象。不幸的是,我从未使用石墨烯,但也许我可以用GraphQL规范来回答,然后对石墨烯代码进行有根据的猜测:

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

input NameInput {
  field1: FistLastInput[]
}

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

这意味着您将需要两个输入对象来描述输入的结构。为您的对象创建一个新类,其中包含字段firstlast

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

现在我们可以在初始查询中使用输入对象:

class NameInput(graphene.InputObjectType):
    field1 = graphene.List(FirstLastInput)

答案 1 :(得分:0)

您可以尝试这样:

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

然后:

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

因此基本上将json作为字符串发送。

答案 2 :(得分:0)

石墨烯提供 GenericScalar 类型。您可以使用它来输入/输出泛型类型,例如 intstrdictlist 等。

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 字段进行输出(查询)时,您将无法查询其子字段。但是您可以为该字段编写一个解析器,以确保只返回特定的子字段。

Here 是指向相应 GitHub 问题的链接。