输入类型#
除了对象类型,GraphQL 还支持输入类型。虽然与对象类型类似,但它们更适合于输入数据,因为它们限制了字段可以使用的类型种类。
GraphQL 规范是这样定义对象类型和输入类型之间的区别的:
GraphQL 对象类型(ObjectTypeDefinition)不适合重用(作为输入),因为对象类型可以包含定义参数的字段,也可以包含对接口和联合的引用,这两种类型都不适合用作输入参数。因此,输入对象在系统中有单独的类型。
定义输入类型#
在 Strawberry 中,可以使用 @strawberry.input
装饰器来定义输入类型,像这样:
import strawberry
@strawberry.input
class Point2D:
x: float
y: float
input Point2D {
x: Float!
y: Float!
}
然后你可以使用输入类型作为你的字段或变更的参数:
import strawberry
@strawberry.type
class Mutation:
@strawberry.mutation
def store_point(self, a: Point2D) -> bool:
return True
如果希望包含可选参数,则需要为它们提供默认值。例如,如果想扩展上面的例子,以允许我们的点的可选标签,可以这样做:
import strawberry
from typing import Optional
@strawberry.input
class Point2D:
x: float
y: float
label: Optional[str] = None
type Point2D {
x: Float!
y: Float!
label: String = null
}
或者你也可以使用 strawberry.UNSET
来代替默认值 None
,这将使该字段在模式中是可选的:
import strawberry
from typing import Optional
@strawberry.input
class Point2D:
x: float
y: float
label: Optional[str] = strawberry.UNSET
type Point2D {
x: Float!
y: Float!
label: String
}
输入 API#
@strawberry.input(name: str = None, description: str = None)
根据类定义创建输入类型。
name
:如果设置了,这将是 GraphQL 的名称,否则 GraphQL 将通过驼峰式的类名来生成。description
:这是在自省模式或使用 GraphiQL 导航模式时返回的 GraphQL 描述。