GraphQL и графен

У меня есть схема базы данных, которая имеет отношение "один ко многим". Например, в одном отделе много клиентов. Возможна ли мутация, которая создает клиента и отдел и связывает их? Или более правильный способ - создать клиента, а не отдел, а затем связать друг друга?

Во втором подходе мне нужно совершить три поездки вместо одной. Может ли кто-нибудь предоставить мне GraphQL для этой ситуации?


person p.magalhaes    schedule 27.12.2016    source источник


Ответы (1)


Вы можете определить входные данные мутации для поддержки вложенных типов. Это позволит вам отправить как Department, так и Customer в одной мутации.

В возвращаемой полезной нагрузке вы можете указать в своем запросе, чтобы он возвращал только что созданный Department и связанный с ним Customer.

class Customer(graphene.ObjectType):
    customer_id = graphene.Int(required=True)
    name = graphene.String(required=True)


class Department(graphene.ObjectType):
    department_id = graphene.Int(required=True)
    name = graphene.String(required=True)
    customers = graphene.List(Customer)


class CustomerInput(graphene.InputObjectType):
    name = graphene.String(required=True)


class DepartmentMutation(graphene.relay.ClientIDMutation):

    class Input:
        name = graphene.String(required=True)
        customer = graphene.Field(CustomerInput)

    department = graphene.Field(Department)

    @classmethod
    def mutate_and_get_payload(cls, input, context, info):
        new_department_name = input.get('name')
        new_customer = input.get('customer')
        logger.debug(new_department_name)
        logger.debug(new_customer)
        # validate and persist...
        # we return dummy objects for brevity
        customer = Customer(
            customer_id=1,
            name=new_customer.get('name')
        )
        department = Department(
            department_id=1,
            name=new_department_name,
            customers=[customer]
        )
        return cls(department=department)

Вы сможете изменять и запрашивать связанные объекты за одну поездку.

введите описание изображения здесь

Все становится немного сложнее, если вы используете Connections для определения отношения, но основной принцип тот же.

person Ivan Choo    schedule 28.07.2017