6

我有以下情况:我有一个用户,每个用户都有一个库存。我正在努力在突变“CreateUser”中声明用户的库存。这是创建用户的以下突变:

mutation Create{
  addUser(UserData:{name:"Shibunika",age:21}
}

我正在尝试在此突变中声明用户的库存,我期望类似

mutation Create{
  addUser(UserData:{name:"Shibunika",age:21,inventory:{'item1':45,'item2':25}
}s

这些数字是每件商品的数量。如何在石墨烯中定义这些输入?你能轻轻地给我看一个模式吗?

4

2 回答 2

11

您可以创建自定义对象类型来表示键值对,然后在您的用户模式中列出这些对象。

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(...
于 2018-07-10T15:25:18.040 回答
3

石墨烯提供了一种GenericScalar类型。您可以使用它来输入/输出通用类型,如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. 但是您可以为该字段编写解析器,以确保只返回特定的子字段。

是相应 GitHub 问题的链接。

在您的情况下,inventory字段具有明确定义的结构,因此 Mark Chackerian 的解决方案更适合。

于 2021-04-02T13:56:09.973 回答