Django 5.2.9 release notes¶
December 2, 2025
Django 5.2.9 fixes one security issue with severity “high”, one security issue with severity “moderate”, and several bugs in 5.2.8.
CVE-2025-13372: Potential SQL injection in FilteredRelation column aliases on PostgreSQL¶
FilteredRelation was subject to SQL injection in column aliases,
using a suitably crafted dictionary, with dictionary expansion, as the
**kwargs passed to QuerySet.annotate() or QuerySet.alias() on
PostgreSQL.
CVE-2025-64460: Potential denial-of-service vulnerability in XML Deserializer¶
XML Serialization was subject to a potential
denial-of-service attack due to quadratic time complexity when deserializing
crafted documents containing many nested invalid elements. The internal helper
django.core.serializers.xml_serializer.getInnerText() previously
accumulated inner text inefficiently during recursion. It now collects text per
element, avoiding excessive resource usage.
Bugfixes¶
Fixed a bug in Django 5.2 where
django.utils.feedgenerator.Stylesheet.__str__()did not escape theurl,mimetype, andmediaattributes, potentially leading to invalid XML markup (#36733).Fixed a bug in Django 5.2 on PostgreSQL where
bulk_create()did not apply a field’s custom query placeholders (#36748).Fixed a regression in Django 5.2.2 that caused a crash when using aggregate functions with an empty
Qfilter over a queryset with annotations (#36751).Fixed a regression in Django 5.2.8 where
DisallowedRedirectwas raised byHttpResponseRedirectandHttpResponsePermanentRedirectfor URLs longer than 2048 characters. The limit is now 16384 characters (#36743).Fixed a crash on Python 3.14+ that prevented template tag functions from being registered when their type annotations required deferred evaluation (#36712).