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.

¿Cómo agregar la cuenta de elementos a un API de FastAPI utilizando SQLAlchemy y Pydantic?

Tengo tres modelos de SQLAlchemy, digamos una tabla ‘proyecto’, una tabla ‘trabajador’ y una tabla ‘equipo’. Estoy usando esquemas de Pydantic.

Los trabajadores y los equipos se pueden asignar a un proyecto mediante claves foráneas (por ejemplo, trabajador.project_id == proyecto.id).

En mi punto final de la API de proyectos, además de la información del proyecto, quiero dar el número (recuento) de trabajadores y equipos asignados al proyecto.

¿Cómo debo hacer esto, si no tengo una columna para estos recuentos en mi tabla ‘proyecto’, y por lo tanto en mi modelo para pasarlos?

class project(Base):
    __tablename__ = "proyectos"
    id = Column(Integer, primary_key=True)
    name = Column(String(80), nullable=False)
    site_name = Column(String(80), nullable=False)
    company_id = Column(Integer, ForeignKey('empresas.id'), nullable=False)

class worker(Base):
    __tablename__ = "trabajadores"
    id = Column(Integer, primary_key=True)
    fullname = Column(String(80), nullable=False)
    project_id = Column(Integer, ForeignKey('proyectos.id'))

class equipment(Base):
    __tablename__ = "equipos"
    id = Column(Integer, primary_key=True)
    name = Column(String(80), nullable=False)
    project_id = Column(Integer, ForeignKey('proyectos.id'))

router = APIRouter(tags=['Proyectos'])

@router.get('/proyectos/', response_model=List[ProjectSchema])
def all_projects(db: Session = Depends(get_db)):
    return project_fn.get_all(db)

project_fn.py

def get_all(db: Session = Depends(get_db)):
    proyectos = db.query(project).all()
    return proyectos

class ProjectSchema(BaseModel):
    id: int
    name: str
    site_name: str = Field(min_length=3)
    company: CompanyBase

class Config:
    orm_mode = True

Ejemplo de API que necesito:

{
    "id": 1,
    "name": "Proyecto-01",
    "site_name": "Sitio-01",
    "company": {
      "id": 1,
      "name": "Empresa-01",
    }
    "worker_count": 5,
    "equipment_count": 3
}

¿Cómo obtener ‘worker_count’ y ‘equipment_count’ aquí?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener los campos worker_count y equipment_count en el punto final de la API de proyectos, puedes agregar dos campos adicionales a la clase ProjectSchema:

    class ProjectSchema(BaseModel):
        id: int
        name: str
        site_name: str = Field(min_length=3)
        company: CompanyBase
        worker_count: int
        equipment_count: int
    
        class Config:
            orm_mode = True
    

    Luego, puedes modificar la función get_all en project_fn.py para consultar las tablas worker y equipment y contar el número de registros que tienen un project_id coincidente:

    from sqlalchemy import func
    
    def get_all(db:Session=Depends(get_db)):
        projects = db.query(project).all()
        for p in projects:
            p.worker_count = db.query(func.count(worker.id)).filter(worker.project_id == p.id).scalar()
            p.equipment_count = db.query(func.count(equipment.id)).filter(equipment.project_id == p.id).scalar()
        return projects
    

    Aquí se utiliza la función count de SQLAlchemy para obtener el número de registros y el método filter() se utiliza para coincidir los registros con el project_id del proyecto actual.

    Con estos cambios, el punto final de la API ahora debería devolver los campos worker_count y equipment_count junto con otra información del proyecto.

Comments are closed.