当我致电
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
之前?
您可以使用“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"}