Skip to main content

fastapi_advanced_filters

PyPI package name: fastapi_advanced_filters.

Type-safe, declarative filtering for FastAPI with first-class SQLAlchemy support.

  • Define filters once, map them to SQLAlchemy columns, and get query conditions, sorting, selection, and q-search out of the box.
  • Pydantic v2 models with a metaclass generate the filter schema from a simple FilterConfig.
  • Dialect-agnostic SQL assertions in tests via compiled literal SQL.

Installation

Python 3.9+ is supported.

Using pip:

pip install fastapi_advanced_filters

If you plan to use SQLAlchemy features, install the extra:

pip install "fastapi_advanced_filters[sqlalchemy]"

With Poetry:

poetry add fastapi_advanced_filters
# or, with extras
poetry add fastapi_advanced_filters -E sqlalchemy

Quickstart

Define your SQLAlchemy model and a filter class. The filter class uses an inner FilterConfig to describe the fields and behaviors.

from sqlalchemy import Column, Integer, String, Boolean, Date
from sqlalchemy.orm import declarative_base

from fastapi_advanced_filters import (
	BaseFilter,
	FieldCriteria,
	LogicalOperator,
	OperationEnum,
	PaginationEnum,
	QSearch,
	Selectable,
	SortBy,
)

Base = declarative_base()

class User(Base):
	__tablename__ = "users"
	id = Column(Integer, primary_key=True)
	first_name = Column(String)
	last_name = Column(String)
	age = Column(Integer)
	is_working = Column(Boolean)
	birthday = Column(Date)


class UserFilter(BaseFilter):
	class FilterConfig:
		model = User
		pagination = PaginationEnum.OFFSET_BASED
		# Map sortable and selectable attributes by name
		sort_by = SortBy(
			model_attrs={
				"first_name": User.first_name,
				"age": User.age,
			},
			alias_as_camelcase=True,
		)
		select_only = Selectable(
			model_attrs={
				"first_name": User.first_name,
				"age": User.age,
			},
			alias_as_camelcase=True,
		)
		# Free-text search across multiple columns
		q_search = QSearch(
			model_attrs=[User.first_name, User.last_name],
			op=OperationEnum.ILIKE,
			logical_op=LogicalOperator.OR,
		)
		# Field-level filtering rules
		fields = [
			FieldCriteria(
				name="first_name",
				field_type=str,
				model_attr=User.first_name,
				op=(OperationEnum.EQ, OperationEnum.ILIKE),
			),
			FieldCriteria(
				name="age",
				field_type=int,
				model_attr=User.age,
				op=(OperationEnum.GTE, OperationEnum.LTE, OperationEnum.IN),
			),
		]

# Use it
f = UserFilter(
	user__first_name__ilike="ali",
	age__gte=18,
	sort_by="-age",
	select="firstName,age",
	q_search="ali",
)
result = f.get_filter_model()
print(result.filters)          # list of SQLAlchemy conditions
print(result.sorting)          # list of (column, direction)
print(result.selected_columns) # mapped selected columns
print(result.q_search)         # OR/AND expression for search
print(result.pagination)       # limit/offset or page/page_size

FastAPI integration

from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session

app = FastAPI()

@app.get("/users")
def list_users(filters: UserFilter = Depends(), db: Session = Depends(get_db)):
	q = db.query(User)
	model = filters.get_filter_model()
	if model.filters:
		q = q.filter(*model.filters)
	if model.q_search is not None:
		q = q.filter(model.q_search)
	if model.sorting:
		for col, direction in model.sorting:
			q = q.order_by(direction(col)) if callable(direction) else q.order_by(col)
	if model.selected_columns:
		q = q.with_entities(*model.selected_columns)
	if model.pagination:
		q = q.limit(model.pagination.limit).offset(model.pagination.offset)
	return q.all()

Documentation

Full docs index:

Direct links:

  • Installation — How to install and optional extras
  • API reference — FilterConfig, FieldCriteria, QSearch, SortBy, Selectable, Pagination
  • Examples — End-to-end examples
  • Extending — Adding operations, custom filters, advanced usage
  • Types — Enums and core dataclasses overview

Development

  • Run tests: pytest -q
  • Lint/type: pre-commit run --all-files
  • Python: 3.9+

Release files for fastapi-advanced-filters 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fastapi-advanced-filters 0.1.0
File Size Uploaded
fastapi_advanced_filters-0.1.0.tar.gz 13.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for fastapi-advanced-filters 0.1.0
File Interpreter ABI Platform
fastapi_advanced_filters-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 35.7 kB

Release files / fastapi_advanced_filters-0.1.0.tar.gz

Download URL fastapi_advanced_filters-0.1.0.tar.gz
Size 13.2 kB
Tags Source
SHA-256 checksum
How to use checksums
295b6ba59d9a608eb484959efef7ead2186fc59b1defa701dcd65895486899b5
BLAKE2b-256 checksum
How to use checksums
92fb38e89b912dd527db8390500898225f090c7b1de11bc481ac41e0cfeee697
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / fastapi_advanced_filters-0.1.0-py3-none-any.whl

Download URL fastapi_advanced_filters-0.1.0-py3-none-any.whl
Size 22.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3800eec81e0791363bf5449395f3c86cc91d3542e2c3deb96885fac30abab886
BLAKE2b-256 checksum
How to use checksums
541e7453ceca2c1cc4af21226ebde53c614e4ad3a088a2a25e231ff8008b1098
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page