python - Pydantic Enum 加载名称而不是值

我有一个枚举类:

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"
}

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

最佳答案

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'))

https://stackoverflow.com/questions/67911340/

相关文章:

reactjs - 当将组件作为函数调用而不是将其用作标签时,React 没有相同的执行顺序?

node.js - 在 NodeJs 中使用 Docker-compose 热重载

java - 打开Feign java.lang.NoSuchFieldError : MULTIP

android - 如何更改android studio中的默认主题?

typescript - 如何强制两种类型在 TypeScript 中不兼容?

git - 如何让 Git 在 Windows 上的 RStudio 中打开提交消息?

python - odoo 13 定制多家公司的产品和供应商

mysql - Spring Boot、Java、Docker Compose,尝试在两个容器(my

.net-core - 仅禁用与 HealthCheck 相关的日志记录

javascript - 如何测试 Chrome 扩展程序的 chrome.runtime.onIn