Metadata-Version: 2.1
Name: pydantic-sqlalchemy-filter
Version: 0.0.8
Summary: Implement simple API filter interface for Sqlalchemy
Home-page: https://github.com/Deskent/pydantic_sqlalchemy_filter
License: MIT
Author: deskent
Author-email: battenetciz@gmail.com
Requires-Python: >=3.10,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Dist: pydantic (>=2.7.2,<3.0.0)
Requires-Dist: sqlalchemy (>=2.0.32,<3.0.0)
Project-URL: Repository, https://github.com/Deskent/pydantic_sqlalchemy_filter
Description-Content-Type: text/markdown

### Stack:

- [x] <a href="https://www.python.org/"><img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/python/python-plain.svg" alt="python" width="15" height="15"/>
  Python 3.11+ <br/></a>
- [x] <a href="https://docs.sqlalchemy.org/en/20"><img src="https://raw.githubusercontent.com/devicons/devicon/master/icons/sqlalchemy/sqlalchemy-plain.svg" alt="sqlalchemy" width="15" height="15"/>
  SqlAlchemy 2<br/></a>
- [x] <a href="https://docs.pydantic.dev/">🕳 Pydantic 2<br/></a>

### Installation

    pip install pydantic-sqlalchemy-filter

### Usage

#### Implement UserFilter

    from pydantic_sqlalchemy_filter import BaseQueryBuilder, DatabaseModel


    class UserFilter(BaseQueryBuilder):
        username: str | None = Field(default=None)
        order_by: str | None = Field(default='username', alias='orderBy')

        def _filter(
            self,
            model: DatabaseModel,
            exclude_deleted: bool = False,
            query: sqlalchemy.Select | None = None,
        ) -> sqlalchemy.Select:
            if query is None:
                query = self.build_base_query(
                    model=model,
                    exclude_deleted=exclude_deleted,
                )

            if self.username is not None
                query = query.filter_by(username=self.username)

            return query

#### In FastAPI router:

        @router.get(path='')
        async def get_all_filtered_users(
            query_builder: Annotated[UserFilter, Depends()],
            session: Annotated[AsyncSession, Depends(get_async_session)],
        ) -> list[Users]:
            query = query_builder.build_select_query(model=User)
            results = await session.execute(query)
            users = results.scalars().all()

            return list(users)

