Filters in code¶
FilterBuilder¶
For programmatic filter creation, use the fluent FilterBuilder API:
from fastapi_fsp import FilterBuilder
# Instead of manually creating Filter objects:
# filters = [
# Filter(field="age", operator=FilterOperator.GTE, value="30"),
# Filter(field="city", operator=FilterOperator.EQ, value="Chicago"),
# ]
# Use the builder pattern:
filters = (
FilterBuilder()
.where("age").gte(30)
.where("city").eq("Chicago")
.where("active").eq(True)
.where("tags").in_(["python", "fastapi"])
.where("created_at").between("2024-01-01", "2024-12-31")
.build()
)
# Use with FSPManager
@app.get("/heroes/")
def read_heroes(session: Session = Depends(get_session), fsp: FSPManager = Depends(FSPManager)):
additional_filters = FilterBuilder().where("deleted").eq(False).build()
fsp.with_filters(additional_filters)
return fsp.generate_response(select(Hero), session)
Available FilterBuilder Methods¶
| Method | Description |
|---|---|
.eq(value) |
Equal to |
.ne(value) |
Not equal to |
.gt(value) |
Greater than |
.gte(value) |
Greater than or equal |
.lt(value) |
Less than |
.lte(value) |
Less than or equal |
.like(pattern) |
Case-sensitive LIKE |
.ilike(pattern) |
Case-insensitive LIKE |
.in_(values) |
IN list |
.not_in(values) |
NOT IN list |
.between(low, high) |
BETWEEN range |
.is_null() |
IS NULL |
.is_not_null() |
IS NOT NULL |
.starts_with(prefix) |
Starts with (case-insensitive) |
.ends_with(suffix) |
Ends with (case-insensitive) |
.contains(substring) |
Contains (case-insensitive) |
Common filter presets¶
For frequently used filter patterns, use CommonFilters:
from fastapi_fsp import CommonFilters
# Active (non-deleted) records
filters = CommonFilters.active() # deleted=false
# Recent records (last 7 days)
filters = CommonFilters.recent(days=7)
# Date range
filters = CommonFilters.date_range(start=datetime(2024, 1, 1), end=datetime(2024, 12, 31))
# Records created today
filters = CommonFilters.today()
# Null checks
filters = CommonFilters.not_null("email")
filters = CommonFilters.is_null("deleted_at")
# Search
filters = CommonFilters.search("name", "john", match_type="contains")
# Combine presets
filters = CommonFilters.active() + CommonFilters.recent(days=30)