Skip to content

1.14.4 — correctness hotfix

Choose a tag to compare

@vsdudakov vsdudakov released this 10 Jul 22:00
· 16 commits to main since this release

Correctness hotfix release. Highlights:

Changed

  • ManyToManyField(through_fields=...) now reads Django's (owner_column, target_column) order — declarations written against the previous (forward_key, backward_key) reading must swap the two elements (the explicit forward_key=/backward_key= kwargs are unchanged).
  • Related-manager bulk writes are unscoped: parent.children.update(...)/.delete() reach every related row even under a soft-delete Meta.manager; reads keep the manager scope.

Fixed

  • Oracle: zero-fraction datetime binds compared unequal to stored values, so col >= :midnight dropped exact-midnight rows — such values now bind as DATE.
  • Datetime write paths: DatetimeField.to_db widens bare dates to midnight datetimes (plain-attribute save(), update(), bulk_update() no longer store date-only text); the __date lookup narrows its value to a date.
  • m2m cleanup is atomic on non-cascading dialects (SQL Server): a failed row delete no longer strips the surviving rows' join links.
  • SQL Server bulk_create: ids return via OUTPUT ... INTO (works with triggers, error 334 gone) in arrival order (correct under negative IDENTITY increments).
  • bulk_get_or_create/bulk_update_or_create accept a mix of explicit and auto pks.
  • PostgreSQL execute_many: numeric mixes widen to NUMERIC (no precision loss above 2^53); naive/aware datetime and str/UUID mixes are accepted.
  • Plus the fifteen correctness fixes from the full-codebase review (#18): ZoneInfo-aware binds, batch parameter-type unification, the sync-fast-path pool deadlock, get_or_create connection binding and root-filter inheritance, decode-plan snapshots, grouped-projection order_by annotations, and manager-scoped lazy relation reads.

Full details in CHANGELOG.md.