1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

Fixed #35996 -- Fixed database serialization crash when serializing a many-to-many field that had a prefetch.

This commit is contained in:
Erica Pisani
2024-12-18 09:03:02 +01:00
committed by Sarah Boyce
parent a8b70aeffd
commit 20f9f61805
3 changed files with 49 additions and 18 deletions

View File

@@ -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,

View File

@@ -148,7 +148,11 @@ class Serializer(base.Serializer):
self.xml.endElement("object")
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:
@@ -156,12 +160,9 @@ class Serializer(base.Serializer):
self.xml.addQuickElement("object", attrs={"pk": str(value.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,