es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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

Tags:  , , , ,

Answer

  1. Avatar for 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 de is_active al crear un nuevo objeto de la clase User. 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.

Comments are closed.