Python 图ql-和#x27;或';用于多个必填输入字段

Python 图ql-和#x27;或';用于多个必填输入字段,python,types,schema,graphql,relay,Python,Types,Schema,Graphql,Relay,我正在研究一个符合中继的GraphQL模式,并希望包含一个变异,它接受一个输入对象,该对象需要一个参数(记录的ID)或两个其他参数(记录的记录号和目录号)。我正在使用Python和库。以下是当前输入对象的一个片段,它不允许使用ID而不是数字/目录: class CreateRecord(relay.ClientIDMutation): "The parameters of a newly created record." # Relay-compliant mutations n

我正在研究一个符合中继的GraphQL模式,并希望包含一个变异,它接受一个输入对象,该对象需要一个参数(记录的ID)或两个其他参数(记录的记录号和目录号)。我正在使用Python和库。以下是当前输入对象的一个片段,它不允许使用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模式中支持这一功能?

没有办法在类型系统中表示条件非空。因此,您必须自己在解析逻辑中验证这一点

但是,为什么不将其拆分为两个单独的显式操作呢?一个需要ID,另一个需要记录和目录号?是的,您必须以不同的方式命名它们,但是明确性是一件好事,您将使用而不是反对类型系统


关于变异设计有一个很好的系列文章,特别是与您的案例相关的。

关于查询,我也有同样的问题。例如,在查询用户时,应提供ID或用户名,但不能同时提供两者。我不确定这种类型的验证是否受到开箱即用的支持。这似乎是一种常见的模式。@jfizz看我的答案,它也适用于你的情况。