2016-12-27 50 views
1

我有一个具有一对多关系的数据库模式。对于例如一个部门有很多客户。是否有可能创建一个客户和一个部门并将其关联起来?或者正确的方法是创建一个客户而不是一个部门,然后相互关联?GraphQL和Graphene

在第二种方法中,我需要做三次而不是一次。 有人可以提供给我一个GraphQL处理这种情况吗?

回答

1

您可以定义您的突变输入以支持嵌套类型。这将允许您发送一个突变DepartmentCustomer

在返回有效负载中,您可以在查询中指定返回新创建的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) 

您将允许您在一次旅行中进行变异和查询关联实体。

enter image description here

事情变得有点复杂,如果你正在使用Connections定义关系,但基本原理是一样的。