为 class 修改 Pydantic json_encoders 无效

Modifying Pydantic json_encoders for a class not working

我有一个 pydantic 模型,其属性之一是另一个模型的实例。

对于我的应用程序,我需要以自定义方式写出该模型。我以为我可以通过在模型配置中设置 json_encoders 来做到这一点,但我无法让它工作。我可以让它为基本类型工作,例如。日期时间但不是我自己的 class.

请参阅下面的最小示例:


from pydantic import BaseModel


def write_list_item(item):
    return [item.a, item.b]


class ListItem(BaseModel):
    a: str
    b: str


class ToyList(BaseModel):
    list_item: ListItem

    class Config:
        json_encoders = {ListItem: write_list_item}


tl = ToyList(list_item=ListItem(a="a1", b="b2"))

print(tl.json())

预期输出:

["a1, "b1"]

观察到的输出:

{"a": "a1", "b": "b1"}

谁能发现我做错了什么?

目前还不能直接做到。合并this PR后才有可能。

因此,您可以考虑模型的不同设计或通过自定义根类型的解决方法,例如(未准备好生产):

class ListItem(BaseModel):
    __root__: List[str]

    @root_validator(pre=True)
    def root_val(cls, values):
        return {"__root__": [values['a'], values['b']]}

    @property
    def a(self):
        return self.__root__[0]

    @property
    def b(self):
        return self.__root__[1]

    def __setattr__(self, key, val):
        if key == 'a':
            self.__root__[0] = val
        elif key == 'b':
            self.__root__[1] = val
        else:
            super().__setattr__(key, val)