如何设置Pydantic字段上的所有enum值?



我使用这些类作为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,其值为SomeRulestyping.List…这肯定是错误的,因为值与类型不匹配。如果您希望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"]}

现在,我猜你在你的应用程序中使用实际的enum成员(不是他们的字符串值),你只是想要RuleChooser.rule是字符串仅作为JSON响应的一部分。然后,您需要再次将rule的定义修改为:

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

表示rule的类型为SomeRulestyping.List,其值为该Enum的所有成员。

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

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

但是作为JSON响应的一部分,FastAPI可以处理从enum到字符串的转换,您将得到:

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

与您想要的相同。

最新更新