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.

Con fastapi/SQLModel, ¿cómo especificar el orden en que se muestran las columnas/campos en una tabla/objeto de respuesta?

Tengo los siguientes modelos/esquemas:

class UserBase(SQLModel):
    full_name: str
    email: EmailStr
    is_active: bool = True
    is_superuser: bool = False

class UserRead(UserBase):
    id: uuid.UUID

class UserCreate(UserBase, extra=Extra.forbid):
    password: str

class UserUpdate(UserBase):
    password: Optional[str] = None

class User(UserBase, table=True):
    id: uuid.UUID = Field(
        default=factory=uuid.uuid4,
        primary_key=True,
        index=True,
        nullable=False,
    )
    hashed_password: Optional[str] = None

En mi cliente de Postgres, la tabla muestra las columnas en el orden en que se listan en los modelos / esquemas:

postgres client

Además, la documentación de OpenAPI enumera los campos del objeto de respuesta en el mismo orden en que se especifican en el modelo User (observe el objeto de respuesta en la parte inferior de la imagen):

openapi docs

Me gustaría tener la columna / campo id como el primer campo en mostrarse en la tabla / objeto de respuesta. En general, ¿cómo puedo imponer un orden específico de las columnas / campos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para aplicar un orden específico a las columnas/campos en la tabla y en el objeto de respuesta, se puede utilizar la biblioteca sqlalchemy y su clase Column, la cual permite especificar el orden de las columnas explícitamente. Aquí hay un ejemplo de cómo se puede hacer para el modelo de User:

    from sqlalchemy import Column, String, Boolean
    from sqlmodel import SQLModel, Field
    
    class User(SQLModel, table=True):
        id: uuid.UUID = Field(
            default_factory=uuid.uuid4,
            primary_key=True,
            index=True,
            nullable=False,
            metadata={"position": 0}
        )
        full_name: str = Column(String, nullable=False, metadata={"position": 1})
        email: str = Column(String, nullable=False, unique=True, index=True, metadata={"position": 2})
        is_active: bool = Column(Boolean, default=True, nullable=False, metadata={"position": 3})
        is_superuser: bool = Column(Boolean, default=False, nullable=False, metadata={"position": 4})
        hashed_password: Optional[str] = Column(String, nullable=True, metadata={"position": 5})
    

    En este ejemplo, hemos agregado el argumento metadata a cada campo, y hemos establecido el atributo position al orden deseado. De esta manera, al crear la tabla o utilizar el objeto de respuesta, las columnas/campos se ordenarán de acuerdo a las posiciones especificadas.

Comments are closed.