为 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)
我有一个 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)