Pydantic - 将对象升级到另一个模型

Moj*_*imi 5 python pydantic fastapi

我有一个 NewUser 模型,它是最终用户输入的内容,我想将该对象更新为 UserInDB,以便我可以将其传递给我的数据库引擎(DynamoDB,需要一个字典)

目前我打了.dict两次电话,这感觉不是正确的方法

from pydantic import BaseModel, Field
from datetime import datetime
from typing import Optional
from uuid import uuid4
    
class NewUser(BaseModel):
    name: str
    email: str
    company_name: Optional[str]
    
class UserInDB(NewUser):
    hash: str = Field(default_factory=uuid4)
    range = 'DATA'
    created_at: datetime = Field(default_factory=datetime.now)
    
#...
#Emulating what an end user would send
user = NewUser(name='Example', company_name='example', email='example@example.com')
    
#Is calling dict twice way to do it?
user_in_db = UserInDB(**user.dict()).dict()
db.create_user(user_in_db)
Run Code Online (Sandbox Code Playgroud)

Jav*_*ier 2

您可以尝试定义 an__init__并且代码看起来会更好(至少对我来说)。

from pydantic import BaseModel, Field
from datetime import datetime
from typing import Optional
from uuid import uuid4

class NewUser(BaseModel):
    name: str
    email: str
    company_name: Optional[str]

class UserInDB(NewUser):
    hash: str = Field(default_factory= lambda: uuid4())
    range = 'DATA'
    created_at: datetime = Field(default_factory= lambda: datetime.now())

    def __init__(self, user: NewUser):
        super().__init__(**user.dict())

#...
# Emulating what an end user would send
user = NewUser(name='Example', company_name='example', email='example@example.com')

# This looks probably better
user_in_db = UserInDB(user)
Run Code Online (Sandbox Code Playgroud)