summaryrefslogtreecommitdiff
path: root/django/core/serializers/python.py
diff options
context:
space:
mode:
authorErica Pisani <erica.pisani@floatcard.com>2024-12-18 09:03:02 +0100
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-12-18 10:39:20 +0100
commit20f9f6180531279785ceabed6ab2f29ab634d8dc (patch)
tree63439d6393edb4d802903b9160fa8fef25063df3 /django/core/serializers/python.py
parenta8b70aeffd41d082d4bd8f99c777f37b6a58da66 (diff)
Fixed #35996 -- Fixed database serialization crash when serializing a many-to-many field that had a prefetch.
Diffstat (limited to 'django/core/serializers/python.py')
-rw-r--r--django/core/serializers/python.py15
1 files changed, 8 insertions, 7 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py
index 57edebbb70..807d4b3977 100644
--- a/django/core/serializers/python.py
+++ b/django/core/serializers/python.py
@@ -74,7 +74,11 @@ class Serializer(base.Serializer):
return value.natural_key()
def queryset_iterator(obj, field):
- return getattr(obj, field.name).iterator()
+ attr = getattr(obj, field.name)
+ chunk_size = (
+ 2000 if getattr(attr, "prefetch_cache_name", None) else None
+ )
+ return attr.iterator(chunk_size)
else:
@@ -82,12 +86,9 @@ class Serializer(base.Serializer):
return self._value_from_field(value, value._meta.pk)
def queryset_iterator(obj, field):
- return (
- getattr(obj, field.name)
- .select_related(None)
- .only("pk")
- .iterator()
- )
+ query_set = getattr(obj, field.name).select_related(None).only("pk")
+ chunk_size = 2000 if query_set._prefetch_related_lookups else None
+ return query_set.iterator(chunk_size=chunk_size)
m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get(
field.name,