簡體   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