You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:07:42