[英]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]
说rule
是SomeRules
类型,它的值是一个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.