mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Fixed #33937 -- Optimized serialization of related m2m fields without natural keys.
This commit is contained in:
committed by
Mariusz Felisiak
parent
604fadde11
commit
19e0587ee5
@@ -70,14 +70,20 @@ class Serializer(base.Serializer):
|
||||
def m2m_value(value):
|
||||
return value.natural_key()
|
||||
|
||||
def queryset_iterator(obj, field):
|
||||
return getattr(obj, field.name).iterator()
|
||||
|
||||
else:
|
||||
|
||||
def m2m_value(value):
|
||||
return self._value_from_field(value, value._meta.pk)
|
||||
|
||||
def queryset_iterator(obj, field):
|
||||
return getattr(obj, field.name).only("pk").iterator()
|
||||
|
||||
m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get(
|
||||
field.name,
|
||||
getattr(obj, field.name).iterator(),
|
||||
queryset_iterator(obj, field),
|
||||
)
|
||||
self._current[field.name] = [m2m_value(related) for related in m2m_iter]
|
||||
|
||||
|
||||
@@ -146,14 +146,20 @@ class Serializer(base.Serializer):
|
||||
self.xml.endElement("natural")
|
||||
self.xml.endElement("object")
|
||||
|
||||
def queryset_iterator(obj, field):
|
||||
return getattr(obj, field.name).iterator()
|
||||
|
||||
else:
|
||||
|
||||
def handle_m2m(value):
|
||||
self.xml.addQuickElement("object", attrs={"pk": str(value.pk)})
|
||||
|
||||
def queryset_iterator(obj, field):
|
||||
return getattr(obj, field.name).only("pk").iterator()
|
||||
|
||||
m2m_iter = getattr(obj, "_prefetched_objects_cache", {}).get(
|
||||
field.name,
|
||||
getattr(obj, field.name).iterator(),
|
||||
queryset_iterator(obj, field),
|
||||
)
|
||||
for relobj in m2m_iter:
|
||||
handle_m2m(relobj)
|
||||
|
||||
Reference in New Issue
Block a user