Repository navigation
Release 2.0.0
Saffier 2.0.0 marks the beginning of a new chapter for the project: a sharper,
fully modernized ORM with a pure-Python core, stronger query and relationship
capabilities, and a cleaner long-term foundation for framework-agnostic async applications.
This release focuses on the areas that matter most in real projects: model behavior,
queryset power, relation handling, migration tooling, tenancy support, compatibility,
and documentation.
Saffier became faster, better, cleaner. This is the same Saffier you know and love, but with a sharper edge and a stronger core
and... a lot of new features and improvements but also... Faster!
Added
- QuerySet set operations:
union,union_all,intersect,intersect_all,except_, andexcept_all. - QuerySet
bulk_get_or_createwithbulk_select_or_insertalias. - QuerySet
local_or,batch_size,extra_select, andreference_selectAPIs. - Settings runtime helpers:
configure_settings,reload_settings, andoverride_settings. - Edgy compatibility modules for legacy imports across queryset, tenancy, admin, Lilya middleware, and model helpers.
- Pure-Python
Model.model_json_schema(...)compatibility and richer tenancy helpers such aswith_schema(...)andusing(database=..., schema=...).
Changed
- Saffier now ships with a fully pure-Python model/runtime layer and no longer depends on Pydantic internally (Like its sibling Edgy does).
- Query and model
delete()now return deleted row counts. - Documentation tooling now follows the Zensical workflow with Edgy-aligned Hatch/Taskfile docs commands (
docs_prepare,docs_build,docs_clean,serve). - CLI, migration, and application-discovery flows were refreshed for the current runtime and template system.
Fixed
- Tenant schema table metadata now keeps foreign-key relationships consistent across related models in non-default schemas.
- QuerySet
raw_delete()added and delete filtering now respects accumulated OR clauses. - Removed
loguru; Saffier now uses Python standard-library logging in core modules. - QuerySet cache parity improved for
all(clear_cache=True), cachedget(), SQL rendering, andselect_for_update(...). - Permission, pagination, lazy-import, and nested
exclude_secrets()compatibility now align more closely with Edgy behavior. - Model save/create extraction now matches Edgy for nullable/default fields, explicit read-only primary-key values, and composite-key / related-field inserts.