Skip to content

Filters

Available filter classes

  • BaseFilter - base class for all filters
  • ModelFilter - class for filtering by pydantic model fields
  • OrderingFilter - class for ordering by fields
  • SearchFilter - class for searching by fields
  • PaginationFilter - class for pagination
  • Filter - All of the above

Available resolvers

  • ObjectFilterResolver - class for filtering by object fields, works for lists of objects/dictionaries.
  • SQLAlchemyFilterResolver - class for filtering by SQLAlchemy model fields

Helpers & Dependencies

  • NestedFilter - class for filtering by nested fields
  • FilterDependency - class for filtering by dependencies

Usage

class PostModel(Base):
    __tablename__ = "post"
    title: str = mapped_column(sa.String())
    content: str = mapped_column(sa.String())
    created_at: datetime = mapped_column(sa.DateTime())
    user_id: int = mapped_column(sa.Integer(), sa.ForeignKey("user.id"))

class UserModel(Base):
    __tablename__ = "user"
    id: int = mapped_column(sa.Integer(), primary_key=True)
    name: str = mapped_column(sa.String())
    email: str = mapped_column(sa.String())
    created_at: datetime = mapped_column(sa.DateTime())


class PostFilter(ModelFilter):
    title: str | None = None


class UserFilter(Filter):
    name: str | None = None
    email: str | None = None

    post: PostFilter = NestedFilter(
        PostFilter, prefix="post"
    ) # query parameter with become post__title

    search_fields = {"name", "email", "post__name"}  # django-like syntax for search fields
    ordering_fields = {"name", "created_at"}


class AsyncListView(AsyncListAPIView):

    async def list(self, filter: Filter = FilterDepends(UserFilter), resolver: SQLAlchemyFilterResolver = Depends()):
        queryset = resolver.apply_filter(filter, select(UserModel))
        # applies ordering, pagination, searching etc.
        async with self.db_session() as session:
            users = await session.execute(queryset)
            return users.scalars().all()