为不工作的类修改Pydantic json_编码器

2024-05-13 10:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

对于我的应用程序,我需要以自定义方式写出该模型。我想我可以通过在模型配置中设置json\u编码器来做到这一点,但我无法让它工作。我可以让它用于基本类型,例如datetime,但不能用于我自己的类

请参阅下面的示例:


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

谁能看出我做错了什么


Tags: 模型json属性a1itemlistclassb1
1条回答
网友
1楼 · 发布于 2024-05-13 10:28:14

目前这还不可能。当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)

相关问题 更多 >