我是Pydantic的新手,正在尝试了解如何/是否可以创建一个新的类实例。我已经通读了Pydantic文档,但找不到执行类似操作的示例。
我的python代码(在Pydantic之前)看起来像这样:
class Person:
def __init__(self, id):
db_result = get_db_content(id) #lookup id in a database and return a result
self.name = db_result['name']
self.birth_year = db_result['birth_year']
p1 = Person(1234)
print(p1.name)如果我想要基于id创建一个Person实例,Pydantic中相应的代码会是什么样子?另外,Pydantic是否可以有多个构造函数用于相同的构造函数
班级。例如:
p1 = Person(1234)
p2 = Person("Jane Doe")发布于 2020-05-14 16:29:46
这在目前还不太可能。您必须使用类似于Person(get_db_content())的东西来创建person。
将来,您将能够拥有允许这样做的计算字段和上下文。
发布于 2021-06-22 22:56:41
我不确定这是否是最“简单”的方法,但是解决这个问题的方法是使用classmethod。
class Person(BaseModel):
id: int
name: str
birth_year: int
@classmethod
def from_id(cls, id: int) -> "Person":
db_result = get_db_content(id) #lookup id in a database and return a result
return cls(**db_result)
p1 = Person.from_id(1234)
print(p1.name)发布于 2021-08-13 22:41:26
你可以考虑的一种模式是为你的pydantic模型使用一个“集合”类。
正如人们所提到的,您的模型可以(应该)只是一个数据存储/验证器。您的集合类可以充当DB的接口,用于获取记录、记录组、执行查找等。并返回模型对象或模型对象列表。
pydantic类示例:
class Person(BaseModel):
id: str
name: Optional[str]
birth_year: Optional[int]集合类:
class PersonCollection:
def __init__(self, db: pymongo.database.Database):
self.collection = db.person_collection
def find_people(self, criteria: dict) -> List[Person]:
person_list: List[Person] = list()
for person_data in self.collection.find(criteria):
person_list.append(Person(**person_data))
return person_list
def save_person(self, person: Person):
key = {"id": person.id}
self.collection.update_one(
filter=key,
update={"$set": person.dict()},
upsert=True
)https://stackoverflow.com/questions/61789002
复制相似问题