Changelog¶
All notable changes to Ferro ORM will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
Breaking¶
Model.getandModel.using(...).getnow return the concrete model type and raiseModelDoesNotExistwhen no row exists (previously they returnedT | None). Use the newget_or_nonefor the old optional behavior.
Added¶
Model.get_or_noneandModel.using(...).get_or_nonefor primary-key lookup without raising.ModelDoesNotExist(LookupErrorsubclass with.modeland.pk), exported fromferro. Documented under Exceptions.- Typed query predicates:
col()wrapper and lambda predicate API onQuery.where,Relation.where, andModel.wherefor static-typing-clean predicates without model annotation changes (#48). See Typed Query Predicates. FieldProxyis now generic (FieldProxy[T]); operator overloads are typedT | FieldProxy[T] -> QueryNode,.like()is gated toFieldProxy[str].- New public symbols re-exported from
ferro.query:col,QueryProxy,Predicate. - Comprehensive documentation restructure
- Tutorial for new users
- How-to guides for common patterns
- Concept pages explaining architecture
Release History¶
For the complete release history, see GitHub Releases.
Version Format¶
- Major (X.0.0): Breaking changes
- Minor (0.X.0): New features, backwards compatible
- Patch (0.0.X): Bug fixes
Upgrade Guide¶
When upgrading between major versions, see the migration guide in the release notes.
Reporting Issues¶
Found a bug? Report it on GitHub.
Contributing¶
See Contributing Guide for how to contribute to Ferro.