【问题标题】:Django Graphene, Passing JSON or dict data as input for MutationDjango Graphene,传递 JSON 或 dict 数据作为 Mutation 的输入
【发布时间】:2018-12-15 21:27:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: django graphene-python graphiql


    【解决方案1】:

    Graphene 提供了一个GenericScalar 类型。您可以使用它来输入/输出泛型类型,例如intstrdictlist 等。

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

    Here 是相应 GitHub 问题的链接。

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

    【讨论】:

      【解决方案2】:

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

      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(...
      

      【讨论】:

        猜你喜欢
        • 2019-03-22
        • 2020-09-12
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 2016-03-24
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多