Ordenamiento
Query string
GET /api/v1/things/?order_by=created_at # ASC
GET /api/v1/things/?order_by=-created_at # DESC (prefijo -)
GET /api/v1/things/?order_by=name # alfabético
Default por service
Cliente puede overridear con ?order_by=name.
Ordenamiento con relaciones
BaseRepository._resolve_order_by() agrega los JOINs.
Campos especiales (aliases)
Si el queryset enriquecido expone columnas calculadas con un alias:
def build_list_queryset(self, **kwargs):
member_count = (
select(func.count(UserRoles.user_id))
.where(UserRoles.role_id == Roles.id)
.scalar_subquery()
.label("member_count")
)
return select(Roles, member_count)
?order_by=-member_count no funciona out-of-the-box. Pasa special_fields:
# en service
async def list_paginated(self, ...):
return await self.repository.list_paginated(
...,
special_fields={"member_count": Roles.id}, # mapea alias a expresión
)
Expresiones SQLAlchemy directas
Desde código:
order_by acepta string o expresión Pydantic — el repo detecta y procesa.