Pydantic — обновление объекта до другой модели

#python #fastapi #pydantic

#python #fastapi #pydantic

Вопрос:

У меня есть модель NewUser, которую вводит конечный пользователь, я хочу обновить объект до UserInDB, чтобы я мог передать его в свой движок БД (DynamoDB, который ожидает dict)

На данный момент я звоню .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= lambda: uuid4())
      range = 'DATA'
      created_at: datetime = Field(default_factory= lambda: 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)
  

Комментарии:

1. ИМХО, нет ничего плохого в вызове .dict() дважды, вам это действительно нужно.

Ответ №1:

Вы могли бы попытаться определить __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)