我试图创建一个graphql突变,在这里我无法将categoryNode作为输入字段添加到AddEquipment突变

时间:2019-10-19 08:36:59

标签: django mongodb graphene-django

类别模型 这是我的类别模型

class Category(models.Model):
    _id = models.ObjectIdField(primary_key=True)
    name = models.CharField(max_length=100)

类别节点 我已经使用中继创建了一个类别节点

class CategoryNode(DjangoObjectType):
    class Meta:
        model = Category
        filter_fields = ['name', 'equipments']
        interfaces = (relay.Node,)

添加equipmemt突变 突变时,我需要在突变输入中向设备对象添加类别对象

class AddEquipment(relay.ClientIDMutation):
    class Input:
        name = graphene.String(required=True)
        category = graphene.Field(CategoryNode)

    equipment = graphene.Field(EquipmentNode)

    @classmethod
    def mutate_and_get_payload(cls, root, info, **inputs):
        equipment_instance = Equipment(
            name=inputs.get('name'),
            category=inputs.get('category')
        )
        equipment_instance.save()
        return AddEquipment(equipment=equipment_instance)

通过此代码,我会收到这样的错误

“ AssertionError:AddEquipmentInput.category字段类型必须是Input Type,但得到的是CategoryNode。”

1 个答案:

答案 0 :(得分:0)

很遗憾,您不能这样做,因为ObjectType不能是InputObjectType。使它起作用的唯一方法是创建一个从InputObjectType派生的新类。

class CategoryInput(graphene.InputObjectType):
    id = graphene.ID(required=True)
    name = graphene.String()

并使用它。

class AddEquipment(relay.ClientIDMutation):
    class Input:
        name = graphene.String(required=True)
        category = graphene.Field(CategoryInput, required=True)

    ...
  

更新

我认为在您的情况下,如果您只想获取类别实例,则没有必要在突变中输入类别的完整详细信息,因此我建议仅输入name和类别{{ 1}}在内部id中,并在class Input内部查询类别实例see example

准确地说,您应该将代码重构为:

mutate_and_get_payload