К сожалению, вы не можете сделать это, поскольку 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
икатегории id
в вашем внутреннем class Input
и запросите экземпляр категории см. пример внутри вашего mutate_and_get_payload
.
Так что, если быть точным, вы должны изменить свой код на:
class AddEquipment(relay.ClientIDMutation):
class Input:
name = graphene.String(required=True)
category_id = graphene.ID(required=True)
equipment = graphene.Field(EquipmentNode)
@classmethod
def mutate_and_get_payload(cls, root, info, **inputs):
# if ID is global make sure to extract the int type id.
# but in this case we assume that you pass an int.
category_instance = Category.objects.get(id=inputs.get('category_id'))
equipment_instance = Equipment(
name=inputs.get('name'),
category=category_instance
)
equipment_instance.save()
return AddEquipment(equipment=equipment_instance)