¿Por qué sqlalchemy no establece el valor predeterminado correctamente?
Por alguna razón, en este ejemplo, el atributo opcional is_active
no se establece en el valor predeterminado.
from pydantic import BaseModel, EmailStr
from datetime import datetime
Esquemas de Pydantic
Propiedades compartidas
class UserBase(BaseModel):
email: Optional[EmailStr] = None
is_active: Optional[bool] = True
is_superuser: bool = False
username: Optional[str] = None
Propiedades para recibir vía API al crear
class UserCreate(UserBase):
email: EmailStr
password: str
Modelo de sqlalchemy
class User(Base):
id = Column(Integer, primary_key=True, index=True)
username = Column(String(25), index=True, unique=True, nullable=False)
email = Column(String(50), unique=True, index=True, nullable=False)
hashed_password = Column(String(256), nullable=False)
is_active = Column(Boolean(), default=True, nullable=False)
is_superuser = Column(Boolean(), default=False, nullable=False)
__mapper_args__ = {"eager_defaults": True}
Esperaba que el valor predeterminado de is_active
, siendo una entrada opcional, fuera True
. Pero obtengo None
si no se pasa explícitamente.
obj_in = UserCreate(email=email, password=password, username=username)
print(obj_in.is_active)
True
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
# is_active=obj_in.is_active,
)
print(db_obj.is_active)
None
Debo agregar explícitamente la bandera is_active
.
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
is_active=obj_in.is_active,
)
print(db_obj.is_active)
True
davy.ai
Parece que puede haber un problema con Pydantic que no establece correctamente el valor predeterminado para
is_active
. Una solución alternativa es pasar explícitamente el valor deis_active
al crear un nuevo objeto de la claseUser
. Sin embargo, sería recomendable consultar la documentación de Pydantic o plantear un problema en su página de Github para encontrar una solución más definitiva a este problema.