.model_dump() 上的字段排序

问题描述 投票:0回答:1

当我致电

my_model.model_dump()
时,我需要以特定方式对字段进行排序。

Pydantic 对于字段的排序方式有 rules。然而我的问题是我有一个

computed_field
,我需要在其他非计算字段之前转储它。无论我做什么,Pydantic 似乎都将这个计算域放在最后。

在下面的示例中,我需要将

computed_field
foobar
放在
buzz
之前:

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

如何让

foobar
在转储模型中出现在
buzz
之前?

python pydantic
1个回答
3
投票

您可以使用“sort_model”方法。这个例子是我只是对键进行排序吗?

from pydantic import BaseModel, computed_field, model_serializer
from typing import Any, Dict

class MyModel(BaseModel):
    foo: str
    bar: str
    buzz: str

    @computed_field
    @property
    def foobar(self) -> str:
        return self.foo + self.bar

    @model_serializer(when_used='json')
    def sort_model(self) -> Dict[str, Any]:
        return dict(sorted(self.model_dump().items()))

my_model = MyModel(foo="foo", bar="bar", buzz="buzz")
print(my_model.model_dump())
print(my_model.model_dump_json())

输出:

{'foo': 'foo', 'bar': 'bar', 'buzz': 'buzz', 'foobar': 'foobar'}
{"bar":"bar","buzz":"buzz","foo":"foo","foobar":"foobar"}

按照您想要的顺序:

from pydantic import BaseModel, computed_field, model_serializer
from typing import Any, Dict

class MyModel(BaseModel):
    foo: str
    bar: str
    buzz: str

    @computed_field
    @property
    def foobar(self) -> str:
        return self.foo + self.bar

    @model_serializer(when_used='json')
    def sort_model(self) -> Dict[str, Any]:
        # return dict(sorted(self.model_dump().items()))
        return {
            "foo": self.foo,
            "bar": self.bar,
            "foobar": self.foobar,
            "buzz": self.buzz
        }

my_model = MyModel(foo="foo", bar="bar", buzz="buzz")
print(my_model.model_dump())
print(my_model.model_dump_json())

输出:

{'foo': 'foo', 'bar': 'bar', 'buzz': 'buzz', 'foobar': 'foobar'}
{"foo":"foo","bar":"bar","foobar":"foobar","buzz":"buzz"}
© www.soinside.com 2019 - 2024. All rights reserved.