#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)