summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Alvarez <juan@sytex.io>2023-08-15 16:53:30 -0300
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-08-19 11:23:59 +0200
commit46b2b08e4531012357dc359809588cbd61a38225 (patch)
tree0833508625a9dce1b188ca7a07ac4259feb36b6e
parentd34db6602e89387ae9ddc9ae94defe5c838acb88 (diff)
[4.2.x] Fixed #34779 -- Avoided unnecessary selection of non-nullable m2m fields without natural keys during serialization.
By using `select_related(None)` instead of `select_related()`, the unnecessary joins are completely avoided. Note that the current tests already covers the change, when the field is not `null=True`. Regression in f9936deed1ff13b20e18bd9ca2b0750b52706b6c. Backport of 517d3bb4dd17e9c51690c98d747b86a0ed8b2fbf from main
-rw-r--r--django/core/serializers/python.py5
-rw-r--r--django/core/serializers/xml_serializer.py5
-rw-r--r--docs/releases/4.2.5.txt4
-rw-r--r--tests/serializers/models/base.py2
4 files changed, 13 insertions, 3 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index 0dc504aa34..7ec894aa00 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -80,7 +80,10 @@ class Serializer(base.Serializer):
def queryset_iterator(obj, field):
return (
- getattr(obj, field.name).select_related().only("pk").iterator()
+ getattr(obj, field.name)
+ .select_related(None)
+ .only("pk")
+ .iterator()
)
m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get(
diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py
index e0129a59bb..3f9955aa23 100644
--- a/django/core/serializers/xml_serializer.py
+++ b/django/core/serializers/xml_serializer.py
@@ -156,7 +156,10 @@ class Serializer(base.Serializer):
def queryset_iterator(obj, field):
return (
- getattr(obj, field.name).select_related().only("pk").iterator()
+ getattr(obj, field.name)
+ .select_related(None)
+ .only("pk")
+ .iterator()
)
m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get(
diff --git a/docs/releases/4.2.5.txt b/docs/releases/4.2.5.txt
index 480b21d902..96b32d6dfc 100644
--- a/docs/releases/4.2.5.txt
+++ b/docs/releases/4.2.5.txt
@@ -16,3 +16,7 @@ Bugfixes
* Fixed a bug in Django 4.2 where the deprecated ``DEFAULT_FILE_STORAGE`` and
``STATICFILES_STORAGE`` settings were not synced with ``STORAGES``
(:ticket:`34773`).
+
+* Fixed a regression in Django 4.2.2 that caused an unnecessary selection of a
+ non-nullable ``ManyToManyField`` without a natural key during serialization
+ (:ticket:`34779`).
diff --git a/tests/serializers/models/base.py b/tests/serializers/models/base.py
index e9f548ad3c..c5a4a0f580 100644
--- a/tests/serializers/models/base.py
+++ b/tests/serializers/models/base.py
@@ -60,7 +60,7 @@ class TopicManager(models.Manager):
class Topic(models.Model):
name = models.CharField(max_length=255)
- category = models.ForeignKey(Category, models.CASCADE, null=True)
+ category = models.ForeignKey(Category, models.CASCADE)
objects = TopicManager()