¿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í?
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:
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:
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.