4

我想让 Pydantic 将布尔值写为“y”或“n”。Pydantic 关于编码器的文档建议我可以配置一种基于数据类型对值进行编码的方法,在我的例子bool中。

from pydantic import BaseModel

class MyStuff(BaseModel):
    do_it: bool = False

    class Config:
        json_encoders = {
            bool: lambda b: "y" if b else "n",
        }

ms = MyStuff()
print(ms.json(exclude_defaults=False))

当我运行这个时,我得到

{“do_it”:假}

当我预料到的时候

{“do_it”:“n”}

其他尝试:

  • 我是否指定默认值都没有关系。

  • 我无法让它适用于其他基本数据类型int,但它确实适用于pathlib.Path.

  • lambda如果我用这样的函数替换它也不起作用:

def convert_my_bool(b: bool) -> str:
    if b:
        return "y"
    return "n"

class MyStuff(BaseModel):
    do_it: bool

    class Config:
        json_encoders = {
            bool: convert_my_bool,
        }

我在这里想念什么?我需要如何将Config我的模型中的布尔值写为“y”或“n”?

4

1 回答 1

2
import orjson
from pydantic import BaseModel


def orjson_dumps(v, *, default=None):
    for key, value in v.items():
        if isinstance(value, bool):
            v[key] = "y" if value else "n"

    return orjson.dumps(
        v,
        default=default,
    ).decode()


class MyStuff(BaseModel):
    do_it: bool = False

    class Config:
        # Change default json encoders/decoders to orjson ones
        json_loads = orjson.loads
        json_dumps = orjson_dumps


ms = MyStuff()
print(ms.json(exclude_defaults=False))
于 2021-04-06T22:49:43.403 回答