枚举#

枚举是一种特殊类型,仅限于一组特定的值。例如,有一些可供选择的冰淇淋,想让用户只从这些选项中进行选择。Strawberry 支持使用 python 标准库中的 enum 定义枚举。下面是关于如何在 Strawberry 中创建枚举类型的快速教程。

首先,为新类型创建新类,它扩展了类 Enum

from enum import Enum


class IceCreamFlavour(Enum):
    ...

然后,将选项作为该类中的变量列表:

class IceCreamFlavour(Enum):
    VANILLA = "vanilla"
    STRAWBERRY = "strawberry"
    CHOCOLATE = "chocolate"

最后,需要将我们的类注册为 strawberry 类型。这是用 strawberry.enum 装饰器完成的:

@strawberry.enum
class IceCreamFlavour(Enum):
    VANILLA = "vanilla"
    STRAWBERRY = "strawberry"
    CHOCOLATE = "chocolate"

看看如何在模式中使用 enum

@strawberry.type
class Query:
    @strawberry.field
    def best_flavour(self) -> IceCreamFlavour:
        return IceCreamFlavour.STRAWBERRY

定义上面的枚举类型将在 GraphQL 中产生以下模式:

enum IceCreamFlavour {
  VANILLA
  STRAWBERRY
  CHOCOLATE
}

下面是如何使用这个新创建的查询的示例:

query {
  bestFlavour
}

下面是执行查询的结果:

{
  "data": {
    "bestFlavour": "STRAWBERRY"
  }
}

也可以在定义对象类型时使用枚举(使用 strawberry.type)。下面是使用 Enum 的对象的字段示例:

@strawberry.type
class Cone:
    flavour: IceCreamFlavour
    num_scoops: int


@strawberry.type
class Query:
    @strawberry.field
    def cone(self) -> Cone:
        return Cone(flavour=IceCreamFlavour.STRAWBERRY, num_scoops=4)

这里有如何使用这个查询的例子:

query {
  cone {
    flavour
    numScoops
  }
}

下面是执行查询的结果:

{
  "data": {
    "cone": {
      "flavour": "STRAWBERRY",
      "numScoops": 4
    }
  }
}

备注

GraphQL 类型不像 python enum 那样是 name: value 的映射。Strawberry 使用枚举成员的名称创建 GraphQL 类型。

你也可以弃用枚举值。要做到这一点,你需要使用 strawberry.enum_valuedeprecation_reason 使用更详细的语法。您可以混合和匹配字符串和详细语法。

@strawberry.enum
class IceCreamFlavour(Enum):
    VANILLA = strawberry.enum_value("vanilla")
    STRAWBERRY = strawberry.enum_value("strawberry", deprecation_reason="We ran out")
    CHOCOLATE = "chocolate"