如何让Pydantic的computed_field在model_dump时排在指定字段前?
问题描述
调用my_model.model_dump()时,需要让计算字段foobar排在非计算字段buzz之前,但Pydantic默认会将计算字段放在序列化结果的末尾。以下是示例代码及期望输出:
原代码:
from pydantic import BaseModel, computed_field class MyModel(BaseModel): foo: str bar: str buzz: str @computed_field @property def foobar(self) -> str: return self.foo + self.bar if __name__ == "__main__": my_model = MyModel(foo="foo", bar="bar", buzz="buzz") print(my_model.model_dump())
默认输出(不符合需求):
{'foo': 'foo', 'bar': 'bar', 'buzz': 'buzz', 'foobar': 'foobar'}
期望输出:
{'foo': 'foo', 'bar': 'bar', 'foobar': 'foobar', 'buzz': 'buzz'}
解决方法
方法1:通过模型配置指定字段顺序
在模型的model_config中为每个字段定义order参数,计算字段同样支持该配置,序列化时会按order值从小到大排序:
修改后的代码:
from pydantic import BaseModel, computed_field class MyModel(BaseModel): foo: str bar: str buzz: str @computed_field @property def foobar(self) -> str: return self.foo + self.bar model_config = { "fields": { "foo": {"order": 0}, "bar": {"order": 1}, "foobar": {"order": 2}, "buzz": {"order": 3} } } if __name__ == "__main__": my_model = MyModel(foo="foo", bar="bar", buzz="buzz") print(my_model.model_dump())
方法2:自定义序列化结果的键顺序
如果不想修改模型定义,可以在序列化后手动调整键的顺序:
if __name__ == "__main__": my_model = MyModel(foo="foo", bar="bar", buzz="buzz") dump_data = my_model.model_dump() # 按需求指定键的顺序 ordered_keys = ["foo", "bar", "foobar", "buzz"] ordered_dump = {key: dump_data[key] for key in ordered_keys} print(ordered_dump)
内容的提问来源于stack exchange,提问作者gavinest
相关产品推荐
相关产品推荐

