Saltar a contenido

Búsqueda textual

search_fields en el service

class ThingService(BaseService):
    search_fields = ["name", "description", "slug"]

Request

GET /api/v1/things/?search=foo

Aplica WHERE (name ILIKE '%foo%' OR description ILIKE '%foo%' OR slug ILIKE '%foo%').

Búsqueda con relaciones

search_fields = ["name", "category__name", "owner__email"]

?search=alice busca en things.name, categories.name, users.email con OR + JOINs automáticos.

Combinado con filtros

GET /api/v1/things/?search=foo&status=active&category_id=abc-123

WHERE (search_condition) AND status='active' AND category_id='abc-123'

Case-sensitive

search_fields usa ILIKE (case-insensitive en Postgres/SQLite, LIKE con collation case-insensitive en MariaDB). Para case-sensitive, override _build_search_condition en el repo.

Beanie (MongoDB)

class ThingRepository(BeanieBaseRepository):
    model = Thing

    async def search(self, term: str) -> list[Thing]:
        return await Thing.find(
            {"$or": [
                {"name": {"$regex": term, "$options": "i"}},
                {"description": {"$regex": term, "$options": "i"}},
            ]}
        ).to_list()