RepoJournal

$ cat django/month/2026-09-01.log

Django

Django

the month in review · September 2026

Django drops PostgreSQL 15 and PostGIS 3.2

By RepoJournal · composed from the cited sources · human-reviewed weekly · methodology

♥

September also brought the 6.1.2/6.0.9/5.2.18 release dates, a batch of ORM regression fixes, and ASGI middleware context switching cut.

135 commits 95 PRs merged 30 briefings covered

all django reviews →

Fixed #37263 -- Fixed changelist __exact search crashes and over-matching. django/django

by adamchainz

Search terms for non-text __exact entries in search_fields were validated with the model field's formfield().to_python(), which let invalid terms through for fields with choices and set a changelist search up to crash or over-match. If your admin search_fields include choice-backed fields, this is the fix.

Fixed #37300 -- Fixed database routing for custom forward prefetch querysets. django/django

by yassinbahri

Custom querysets passed to forward ForeignKey and reverse OneToOneField prefetches lost the parent instance database routing hint in 6.1 and could hit the wrong database. The fix restores the hint. If you use multiple databases with custom prefetch querysets, check your 6.1 upgrade against this.

Fixed #37309 -- Used _is_pk_set() in Model.__eq__ and the XML serializer. django/django

by dennybiasiolli

Model.__eq__ and the XML serializer decided whether an instance was unsaved with pk is None, which is wrong for composite primary keys (pk is a tuple like (None, None)) and for db_default PKs, where DatabaseDefault is not None. Distinct unsaved instances compared equal, and XML dumps emitted a dummy pk attribute; both now use _is_pk_set().

Fixed #37222 -- Fixed QuerySet.distinct() crash on duplicated selections. django/django

by davegaeddert

A regression from 65ad4ade caused a crash when two lookup paths resolved to the same column and ordering referred to each selection by its own position. QuerySet.distinct() on duplicated selections was broken on PostgreSQL, which binds a DISTINCT ON clause to those positions.

Improve search performance django/djangoproject.com

by jacobtylerwalls

Searches returning around 200 results, such as "Model", were traced to headline annotations being computed on every row before the limit was applied. Moving the annotation after the paginator derives offset and limit took the query from 850ms to 250ms.

Fixed #37312, Refs #36605 -- Fixed annotation preservation and key selection in in_bulk(). django/django

by yassinbahri

QuerySet.in_bulk() rebuilt values() and values_list() projections from query.values_select, dropping annotations and mis-selecting keys. If you call in_bulk() on an annotated queryset, the annotations now survive.

Fixed #37237 -- Improved RelatedIn lookup preparation performance. django/django

by Mariano Baragiola

The RelatedIn lookup preparation path got a performance improvement, with the implementation idea credited to Simon Charette. It cuts the per-query overhead of related-field __in lookups.

Fixed #37311 -- Prevented consumption of rhs iterators in annotation lookups. django/django

by yassinbahri

In and range lookups against an annotation on the left-hand side consumed iterator right-hand sides while preparing the query. The iterator is now materialized once before its values are checked for expressions, so a generator passed to __in survives the lookup.

$ ls django/month/ # the briefings behind this review

Tue Sep 1 Django fixes changelist search crashes and boosts djangoproject.com search speed Wed Sep 2 Django fixes equality and XML serialization for unsaved composite primary keys Thu Sep 3 Django fixes two query regressions in ORM Fri Sep 4 Django deprecation warnings switch to calendar-based names Sat Sep 5 Django prepares for calendar versioning with new version tuple support Sun Sep 6 Docs search fragments fixed, Benevity link restored Mon Sep 7 Django bumps minimum oracledb to 4.0.2 Tue Sep 8 Django tutorial cleanup, ModelFormSet prefix fix Wed Sep 9 Django fixes accidental deletion of network rasters Thu Sep 10 Django security team adds two members Fri Sep 11 David Smith and Ken Whitesell join Django's security team Sat Sep 12 django-asv benchmarks add ubuntu-latest results Sun Sep 13 django-asv benchmarks now report on ubuntu-latest Mon Sep 14 django-asv adds ubuntu-latest benchmark results Tue Sep 15 EmailValidator gains per-part validation, ASV adds ubuntu-latest Wed Sep 16 Django fixes the admin vertical filter widget, docs the MAILERS migration Thu Sep 17 Django ASV adds ubuntu-latest results, DSF publishes August and September minutes Fri Sep 18 GeneratedField null check reverted, sponsorship pages rebuilt Sat Sep 19 GenericIPAddressField accepts ipaddress objects, djangoproject.com tests go multi-browser Sun Sep 20 Django drops PostgreSQL 15 and PostGIS 3.2, patches an admin date_hierarchy 500 Mon Sep 21 Django documents srid=-1 and fixes a Prefetch example Tue Sep 22 django-asv adds ubuntu-latest benchmark results Wed Sep 23 All quiet across the Django stack Thu Sep 24 Django backfills release notes for 6.0.4 and 6.0.6 translations Fri Sep 25 ASGI middleware context switching cut, GDAL 3.3 and 3.4 dropped Sat Sep 26 django-asv benchmarks gain an ubuntu-latest runner Sun Sep 27 django-asv adds ubuntu-latest benchmark results Mon Sep 28 Django wraps async iteration in aclosing Tue Sep 29 distinct(*fields) resolves aliases containing "__", and asgiref trims the TLS extension to client certificate chains Wed Sep 30 SQLite parent directories created automatically, 6.1.2/6.0.9/5.2.18 release dates confirmed

Keep up with Django in about 3 minutes: what actually shipped — the commits, pull requests, releases, and security advisories that matter.

or

fair warning: these emails are deeply technical. diffs, version numbers, CVEs, benchmark deltas. if that's not your idea of a good read, this isn't your newsletter.

Folds into your digest — weekly by default, monthly if you prefer. Unsubscribe in one click.

all django reviews →