From 96a7a652166bece8acc96d6335ebb8091de2f496 Mon Sep 17 00:00:00 2001 From: "Michiel W. Beijen" Date: Fri, 6 Dec 2024 20:54:41 +0100 Subject: [PATCH 1/2] Fixed #35961 -- Migrated license metadata in pyproject.toml to conform PEP 639. See https://peps.python.org/pep-0639/ and https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license-and-license-files. Co-authored-by: Jacob Walls --- docs/intro/reusable-apps.txt | 4 ++-- pyproject.toml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/intro/reusable-apps.txt b/docs/intro/reusable-apps.txt index 6c953a404384..c82a2b456e18 100644 --- a/docs/intro/reusable-apps.txt +++ b/docs/intro/reusable-apps.txt @@ -208,7 +208,7 @@ this. For a small app like polls, this process isn't too difficult. :caption: ``django-polls/pyproject.toml`` [build-system] - requires = ["setuptools>=69.3"] + requires = ["setuptools>=77.0.3"] build-backend = "setuptools.build_meta" [project] @@ -219,6 +219,7 @@ this. For a small app like polls, this process isn't too difficult. ] description = "A Django app to conduct web-based polls." readme = "README.rst" + license = "BSD-3-Clause" requires-python = ">= 3.12" authors = [ {name = "Your Name", email = "yourname@example.com"}, @@ -228,7 +229,6 @@ this. For a small app like polls, this process isn't too difficult. "Framework :: Django", "Framework :: Django :: X.Y", # Replace "X.Y" as appropriate "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", diff --git a/pyproject.toml b/pyproject.toml index 5b15d3711657..3fc10a0131f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=75.8.1"] +requires = ["setuptools>=77.0.3"] build-backend = "setuptools.build_meta" [project] @@ -16,13 +16,13 @@ authors = [ ] description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." readme = "README.rst" -license = {text = "BSD-3-Clause"} +license = "BSD-3-Clause" +license-files = ["LICENSE", "LICENSE.python"] classifiers = [ "Development Status :: 2 - Pre-Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", From 608d3ebc8889863d43be1090d634b9507fe4a85e Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Thu, 28 Aug 2025 17:19:20 -0300 Subject: [PATCH 2/2] Fixed #36526 -- Doc'd QuerySet.bulk_update() memory usage when batching. Thanks Simon Charette for the review. --- docs/ref/models/querysets.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt index aee10e55fc7c..f290970d2c3a 100644 --- a/docs/ref/models/querysets.txt +++ b/docs/ref/models/querysets.txt @@ -2506,6 +2506,21 @@ them, but it has a few caveats: * If updating a large number of columns in a large number of rows, the SQL generated can be very large. Avoid this by specifying a suitable ``batch_size``. +* When updating a large number of objects, be aware that ``bulk_update()`` + prepares all of the ``WHEN`` clauses for every object across all batches + before executing any queries. This can require more memory than expected. To + reduce memory usage, you can use an approach like this:: + + from itertools import islice + + batch_size = 100 + ids_iter = range(1000) + while ids := list(islice(ids_iter, batch_size)): + batch = Entry.objects.filter(ids__in=ids) + for entry in batch: + entry.headline = f"Updated headline {entry.pk}" + Entry.objects.bulk_update(batch, ["headline"], batch_size=batch_size) + * Updating fields defined on multi-table inheritance ancestors will incur an extra query per ancestor. * When an individual batch contains duplicates, only the first instance in that