Option A: Use a @validator
有关详情,请参阅validators documentation.
from typing import Any
from pydantic import BaseModel, validator
class Model(BaseModel):
foo: str
bar: str
foobar: str = ""
@validator("foobar", always=True)
def set_if_empty(cls, v: str, values: dict[str, Any]) -> str:
if v == "":
return values["foo"] + values["bar"]
return v
obj = Model(foo="a", bar="b")
print(obj) # foo='a' bar='b' foobar='ab'
如此一来,foobar
仍然是一个常规的模范领域.
请注意,要使其起作用,foobar
必须定义为after、foo
和bar
.否则你就得用root validator美元了.
Option B: Make it a @property
from pydantic import BaseModel
class Model(BaseModel):
foo: str
bar: str
@property
def foobar(self) -> str:
return self.foo + self.bar
obj = Model(foo="a", bar="b")
print(obj) # foo='a' bar='b'
print(obj.foobar) # ab
则foobar
将不再是模型字段,因此不是模式的一部分.这可能与你相关,也可能与你无关.
Option C: Make it a @computed_field
(Pydantic v2 only!)
Defining computed fields将适用于《平凡的2》.
from pydantic import BaseModel, computed_field
class Model(BaseModel):
foo: str
bar: str
@computed_field
@property
def foobar(self) -> str:
return self.foo + self.bar
obj = Model(foo="a", bar="b")
print(obj) # foo='a' bar='b' foobar='ab'