3

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

有谁知道这将如何工作?

提前致谢

4

3 回答 3

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)
于 2018-01-04T13:23:13.810 回答
0

石墨烯提供了一种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 问题的链接。

于 2021-04-02T13:09:00.420 回答
0

你可以这样尝试:

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

接着:

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

所以基本上将json作为字符串发送。

于 2019-03-28T16:12:00.733 回答