繁体   English   中英

如何在 Pydantic 字段上设置所有枚举值?

[英]How to set all the enum values on a Pydantic field?

我将这些类用作 FastAPI 响应的一部分:

class SomeRules(str, Enum):
    a_rule = "something"
    b_rule = "something_else"

class RuleChooser(BaseModel):
    rule: SomeRules = List[SomeRules]

在 JSON 响应中,我想将rule设置为:

{ 
    rule: ["something", "something_else"]
}

我如何实现这一目标?

现在我得到的输出为:

rule: type.literal["something", "something_else"]

或者

literal.type["A", "B", "C"]

我已经测试了多个版本,但没有一个版本返回所需的结果。

  • rules = Literal["A", "B", "C"]
  • rule: SomeRules = Somerules.rules

任何帮助将不胜感激。

我正在使用 Pydantic 1.9.1 版

最简单、直接的答案是修复您对rule的定义。

这个

class RuleChooser(BaseModel):
    rule: SomeRules = List[SomeRules]

ruleSomeRules类型,它的值是一个typing.List of SomeRules ...这绝对是错误的,因为该值与类型不匹配。 如果您希望rule仅包含枚举的字符串值,则可以将其键入为List[str]然后获取枚举的所有值

from pydantic import Field

class SomeRules(str, Enum):
    a_rule = "something"
    b_rule = "something_else"

class RuleChooser(BaseModel):
    rule: List[str] = Field(default=[rule.value for rule in SomeRules])

@app.get("/")
async def root():
    return RuleChooser()
$ curl http://127.0.0.1:8000
{"rule":["something","something_else"]}

现在,我猜你在你的应用程序中使用了实际的枚举成员(而不是它们的字符串值),并且你只希望RuleChooser.rule作为 JSON 响应的一部分作为字符串。 然后,您需要再次将rule的定义修复为:

from pydantic import Field

class RuleChooser(BaseModel):
    rule: List[SomeRules] = Field(default=list(SomeRules))

这表示该rule的类型为typing.List of SomeRules ,其值是该 Enum 的所有成员

如果你打印一个RuleChooser().rule的实例,你会得到:

[<SomeRules.a_rule: 'something'>, <SomeRules.b_rule: 'something_else'>]

但作为 JSON 响应的一部分,FastAPI 可以处理从枚举到字符串的转换,你会得到:

@app.get("/")
async def root():
    return RuleChooser()
$ curl http://127.0.0.1:8000
{"rule":["something","something_else"]}

这和你想要的一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM