[英]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.