我正在尝试传递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)
有没有人知道这会如何运作?
提前致谢
答案 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!
}
这意味着您将需要两个输入对象来描述输入的结构。为您的对象创建一个新类,其中包含字段first
和last
:
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
类型。您可以使用它来输入/输出泛型类型,例如 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
字段进行输出(查询)时,您将无法查询其子字段。但是您可以为该字段编写一个解析器,以确保只返回特定的子字段。
Here 是指向相应 GitHub 问题的链接。