GraphQL - 'either / or' 用于多个必填输入字段
GraphQL - 'either / or' for multiple required input fields
我正在研究符合 Relay 的 GraphQL 模式,并希望包含一个突变,该突变接受一个输入对象,该输入对象需要一个参数(记录的 ID)或两个其他参数(一个记录号和一个目录号备案)。我正在使用 Python 和 Graphene 库。这是当前输入对象的片段,不允许使用 ID 代替数字/目录:
class CreateRecord(relay.ClientIDMutation):
"The parameters of a newly created record."
# Relay-compliant mutations need to specify an input class.
class Input:
"The available inputs for the CreateRecord mutation."
part_id = graphene.Int(description='The ID of the record.')
part_number = graphene.String(description='The record number.',
required=True)
catalog = graphene.String(description='The catalog of the record.',
required=True)
我研究了接口和联合以实现这一点,但到目前为止还没有成功。如果没有更灵活的输入对象,我可能需要创建另一个变异(如 CreateRecordUsingID
)。有没有办法实现这一点,或者更普遍地支持 GraphQL 模式中的这一功能?
无法在类型系统中表达条件 non-nullness。所以你必须自己在解析逻辑中验证这一点。
但是,为什么不将其拆分为 2 个单独的显式操作呢?一种需要 ID,一种需要记录号和目录号?是的,你必须以不同的方式命名它们,但明确是一件好事,你将使用而不是反对类型系统。
有一个关于突变设计的好文章系列,this entry 尤其与您的案例相关。
我正在研究符合 Relay 的 GraphQL 模式,并希望包含一个突变,该突变接受一个输入对象,该输入对象需要一个参数(记录的 ID)或两个其他参数(一个记录号和一个目录号备案)。我正在使用 Python 和 Graphene 库。这是当前输入对象的片段,不允许使用 ID 代替数字/目录:
class CreateRecord(relay.ClientIDMutation):
"The parameters of a newly created record."
# Relay-compliant mutations need to specify an input class.
class Input:
"The available inputs for the CreateRecord mutation."
part_id = graphene.Int(description='The ID of the record.')
part_number = graphene.String(description='The record number.',
required=True)
catalog = graphene.String(description='The catalog of the record.',
required=True)
我研究了接口和联合以实现这一点,但到目前为止还没有成功。如果没有更灵活的输入对象,我可能需要创建另一个变异(如 CreateRecordUsingID
)。有没有办法实现这一点,或者更普遍地支持 GraphQL 模式中的这一功能?
无法在类型系统中表达条件 non-nullness。所以你必须自己在解析逻辑中验证这一点。
但是,为什么不将其拆分为 2 个单独的显式操作呢?一种需要 ID,一种需要记录号和目录号?是的,你必须以不同的方式命名它们,但明确是一件好事,你将使用而不是反对类型系统。
有一个关于突变设计的好文章系列,this entry 尤其与您的案例相关。