FastAPI Filter

2.0.1 · active · verified Thu Apr 16

fastapi-filter is a FastAPI extension that provides a flexible way to add filtering capabilities to your API endpoints. It integrates seamlessly with popular ORMs/ODMs like SQLAlchemy, MongoEngine, and Beanie. The current version is 2.0.1 and it maintains an active release cadence, frequently updating to support the latest versions of FastAPI, Pydantic, and its database backend dependencies.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to set up `fastapi-filter` with SQLAlchemy. It defines an `Item` model, an `ItemFilter` schema using `FilterDepends`, and an endpoint that applies the filters to database queries. Remember to install `fastapi-filter[sqlalchemy]` and other necessary dependencies.

from fastapi import FastAPI, Depends
from typing import Optional
from pydantic import Field
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker, Session
from fastapi_filter.contrib.sqlalchemy import Filter, FilterDepends

# 1. Database setup (in-memory SQLite for example)
SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class Item(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    description = Column(String)

Base.metadata.create_all(bind=engine)

# Dependency to get DB session
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# 2. Define your Filter schema
class ItemFilter(Filter):
    name: Optional[str] = Field(None, description="Filter by item name")
    id__gt: Optional[int] = Field(None, alias="id_gt", description="Filter by ID greater than")
    
    class Constants(Filter.Constants):
        model = Item # Associate filter with your SQLAlchemy model
        search_field_name = "name" # Example search field

# 3. FastAPI application
app = FastAPI()

@app.on_event("startup")
async def startup_event():
    db = SessionLocal()
    # Populate data if empty for demonstration
    if not db.query(Item).first():
        db.add(Item(name="First Item", description="Description of first item"))
        db.add(Item(name="Second Item", description="Description of second item"))
        db.commit()
    db.close()

@app.get("/items/")
async def read_items(
    item_filter: ItemFilter = FilterDepends(ItemFilter),
    db: Session = Depends(get_db)
):
    query = item_filter.filter(db.query(Item))
    items = query.all()
    return items

# To run this example:
# 1. pip install fastapi uvicorn sqlalchemy fastapi-filter[sqlalchemy]
# 2. Save the code as main.py
# 3. Run from your terminal: uvicorn main:app --reload
# 4. Access in browser/curl:
#    http://127.0.0.1:8000/items/
#    http://127.0.0.1:8000/items/?name=First%20Item
#    http://127.0.0.1:8000/items/?id_gt=1

view raw JSON →