首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pydantic和“构造函数”

Pydantic和“构造函数”
EN

Stack Overflow用户
提问于 2020-05-14 11:50:06
回答 4查看 3.5K关注 0票数 2

我是Pydantic的新手,正在尝试了解如何/是否可以创建一个新的类实例。我已经通读了Pydantic文档,但找不到执行类似操作的示例。

我的python代码(在Pydantic之前)看起来像这样:

代码语言:javascript
复制
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是否可以有多个构造函数用于相同的构造函数

班级。例如:

代码语言:javascript
复制
p1 = Person(1234)
p2 = Person("Jane Doe")
EN

回答 4

Stack Overflow用户

发布于 2020-05-14 16:29:46

这在目前还不太可能。您必须使用类似于Person(get_db_content())的东西来创建person。

将来,您将能够拥有允许这样做的计算字段和上下文。

票数 2
EN

Stack Overflow用户

发布于 2021-06-22 22:56:41

我不确定这是否是最“简单”的方法,但是解决这个问题的方法是使用classmethod。

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2021-08-13 22:41:26

你可以考虑的一种模式是为你的pydantic模型使用一个“集合”类。

正如人们所提到的,您的模型可以(应该)只是一个数据存储/验证器。您的集合类可以充当DB的接口,用于获取记录、记录组、执行查找等。并返回模型对象或模型对象列表。

pydantic类示例:

代码语言:javascript
复制
class Person(BaseModel):
    id: str
    name: Optional[str]
    birth_year: Optional[int]

集合类:

代码语言:javascript
复制
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
         )
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61789002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档