From 20f9f6180531279785ceabed6ab2f29ab634d8dc Mon Sep 17 00:00:00 2001 From: Erica Pisani Date: Wed, 18 Dec 2024 09:03:02 +0100 Subject: Fixed #35996 -- Fixed database serialization crash when serializing a many-to-many field that had a prefetch. --- django/core/serializers/python.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'django/core/serializers/python.py') 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, -- cgit v1.3