我使用这些类作为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
,其值为SomeRules
的typing.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
的类型为SomeRules
的typing.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"]}
与您想要的相同。