python Pydantic枚举加载名称而不是值

7gyucuyw  于 2023-02-28  发布在  Python
关注(0)|答案(3)|浏览(178)

我有一个枚举类:

class Group(enum.Enum):
    user = 0
    manager = 1
    admin = 2

我有一个迂腐的模型:

class User(BaseModel):
    id: int
    username: str
    group: Group

它生成了序列化到json的以下内容:

{
    "id": 5,
    "username": "admin",
    "group": 2
}

但是,我希望获得枚举字段的名称而不是它的值,所以它应该是:

{
    "id": 5,
    "username": "admin",
    "group": "admin"
}

这可能吗?如果可能,怎么可能?

xxslljrj

xxslljrj1#

pydantic Github中,我找到了一个解决这个问题的讨论:Map string value to int #598
samuelcolvin提出了这样的建议:

class Choices(int, Enum):
    anne = 1
    ben = 2
    charlie = 3
    dave = 4

    @classmethod
    def __get_validators__(cls):
        cls.lookup = {v: k.value for v, k in cls.__members__.items()}
        yield cls.validate

    @classmethod
    def validate(cls, v):
        try:
            return cls.lookup[v]
        except KeyError:
            raise ValueError('invalid value')

class Model(BaseModel):
    choice: Choices

debug(Model(choice='charlie'))
wrrgggsh

wrrgggsh2#

这个问题并不复杂,一年多了,你还没有一个合适的答案,这有点令人惊讶。
一个促成因素可能是你的标题不正确。我发现如果我用正确的术语来框住我的问题,我更有可能得到有帮助的搜索结果。
就我所知,从你的问题,你不是试图“加载”任何东西,你的问题是,你想编码你的Pydantic字段使用Enum名称而不是值,当序列化你的模型到JSON。
你所需要做的就是在BaseModel子类中添加一个Config类,为Group类型指定一个JSON编码器。json_encoders属性是一个dict类型,带有序列化调用项:

import enum
from pydantic import BaseModel

class Group(enum.Enum):
    user = 0
    manager = 1
    admin = 2

class User(BaseModel):
    id: int
    username: str
    group: Group

    class Config:
        json_encoders = {Group: lambda g: g.name}

user = User(id=5, username="admin", group=2)
print(user)  # id=5 username='admin' group=<Group.admin: 2>
print(user.json())  # {"id": 5, "username": "admin", "group": "admin"}

请更正您的问题标题,以便其他人更容易找到此答案。谢谢。

jchrr9hc

jchrr9hc3#

class Group(enum.Enum):
    user = "user"
    manager = "manager"
    admin = "admin"

成功了:o🎉

相关问题