Django Graphene,传递 JSON 或 dict 数据作为 Mutation 的输入
Django Graphene, Passing JSON or dict data as input for Mutation
我有以下情况:我有一个用户,每个用户都有一个库存。我正在努力在 Mutation "CreateUser" 中声明用户的库存。以下是用于创建用户的变更:
mutation Create{
addUser(UserData:{name:"Shibunika",age:21}
}
我正在尝试在此突变中声明用户的库存,我希望是这样的
mutation Create{
addUser(UserData:{name:"Shibunika",age:21,inventory:{'item1':45,'item2':25}
}s
这些数字是每件商品的数量。
我如何在石墨烯中定义这些输入?
你能轻轻地给我看一下这个的架构吗?
您可以创建自定义对象类型来表示键值对,然后在您的用户架构中列出这些对象。
class InventoryKeyValueType(graphene.InputObjectType):
name = graphene.String(required=True)
int_value = graphene.Int(required=True)
class AddUser(graphene.Mutation):
user = graphene.Field(lambda: UserType)
ok = graphene.Boolean()
class Arguments:
# User Fields
name = graphene.String()
....
inventory = graphene.List(InventoryKeyValueType)
语法有点笨拙但可行:
mutation { addUser(name:"Shibunika", age:21, inventory:[ {name: "item1", intValue: 45}, {name: "item2", intValue:25}]){ok}
其他输入类型
这种方法可以很容易地扩展到整数以外的其他输入类型,例如替换
int_value = graphene.Int(...
和
str_value = graphene.String(...
石墨烯提供了GenericScalar
类型。您可以将它用于 input/output 泛型类型,例如 int
、str
、dict
、list
等
from graphene import InputObjectType, Mutation, String, Int
from graphene.types.generic import GenericScalar
class UserInput(InputObjectType):
name = String()
age = Int()
inventory = GenericScalar()
class addUser(Mutation):
class Arguments:
user_data = UserInput()
def mutate(root, info, user_data):
# do something with user_data
你的输入看起来像
mutation Create {
addUser (
userData: {
name: "Shibunika"
age: 21
inventory: {
item1: 45,
item2: 25
}
}
)
}
请注意 inventory
可以接受任何通用输入,因此请确保对其进行验证。
此外,当使用 GenericScalar
字段进行输出(查询)时,您将无法查询其子字段,例如item1
、item2
。但是您可以为该字段编写一个解析器,以确保只返回特定的子字段。
Here 是 link 对应的 GitHub 问题。
在您的情况下,inventory
字段具有明确定义的结构,因此 Mark Chackerian 的解决方案更适合。
我有以下情况:我有一个用户,每个用户都有一个库存。我正在努力在 Mutation "CreateUser" 中声明用户的库存。以下是用于创建用户的变更:
mutation Create{
addUser(UserData:{name:"Shibunika",age:21}
}
我正在尝试在此突变中声明用户的库存,我希望是这样的
mutation Create{
addUser(UserData:{name:"Shibunika",age:21,inventory:{'item1':45,'item2':25}
}s
这些数字是每件商品的数量。 我如何在石墨烯中定义这些输入? 你能轻轻地给我看一下这个的架构吗?
您可以创建自定义对象类型来表示键值对,然后在您的用户架构中列出这些对象。
class InventoryKeyValueType(graphene.InputObjectType):
name = graphene.String(required=True)
int_value = graphene.Int(required=True)
class AddUser(graphene.Mutation):
user = graphene.Field(lambda: UserType)
ok = graphene.Boolean()
class Arguments:
# User Fields
name = graphene.String()
....
inventory = graphene.List(InventoryKeyValueType)
语法有点笨拙但可行:
mutation { addUser(name:"Shibunika", age:21, inventory:[ {name: "item1", intValue: 45}, {name: "item2", intValue:25}]){ok}
其他输入类型
这种方法可以很容易地扩展到整数以外的其他输入类型,例如替换
int_value = graphene.Int(...
和
str_value = graphene.String(...
石墨烯提供了GenericScalar
类型。您可以将它用于 input/output 泛型类型,例如 int
、str
、dict
、list
等
from graphene import InputObjectType, Mutation, String, Int
from graphene.types.generic import GenericScalar
class UserInput(InputObjectType):
name = String()
age = Int()
inventory = GenericScalar()
class addUser(Mutation):
class Arguments:
user_data = UserInput()
def mutate(root, info, user_data):
# do something with user_data
你的输入看起来像
mutation Create {
addUser (
userData: {
name: "Shibunika"
age: 21
inventory: {
item1: 45,
item2: 25
}
}
)
}
请注意 inventory
可以接受任何通用输入,因此请确保对其进行验证。
此外,当使用 GenericScalar
字段进行输出(查询)时,您将无法查询其子字段,例如item1
、item2
。但是您可以为该字段编写一个解析器,以确保只返回特定的子字段。
Here 是 link 对应的 GitHub 问题。
在您的情况下,inventory
字段具有明确定义的结构,因此 Mark Chackerian 的解决方案更适合。