Я пытаюсь создать мутацию graphql, где я не могу добавить categoryNode в качестве входного поля для мутации AddEquipment - PullRequest
0 голосов
/ 19 октября 2019

модель категории эта модель моей категории

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 должен быть типом ввода, но получен: CategoryNode. "

1 Ответ

0 голосов
/ 21 октября 2019

К сожалению, вы не можете сделать это, поскольку 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)
...