From e6108b7388775f4996a5906e0525fbdd40d2df51 Mon Sep 17 00:00:00 2001 From: VIZZARD-X Date: Sat, 27 Dec 2025 13:54:14 +0530 Subject: Fixed #36750 -- Made ordering of M2M objects deterministic in serializers. Co-authored-by: Simon Charette Co-authored-by: Jacob Walls --- django/core/serializers/xml_serializer.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'django/core/serializers/xml_serializer.py') diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py index d8ffbdf00a..3d1f79ea0d 100644 --- a/django/core/serializers/xml_serializer.py +++ b/django/core/serializers/xml_serializer.py @@ -177,7 +177,15 @@ class Serializer(base.Serializer): chunk_size = ( 2000 if getattr(attr, "prefetch_cache_name", None) else None ) - return attr.iterator(chunk_size) + query_set = attr.all() + if not query_set.totally_ordered: + current_ordering = ( + query_set.query.order_by + or query_set.model._meta.ordering + or [] + ) + query_set = query_set.order_by(*current_ordering, "pk") + return query_set.iterator(chunk_size) else: @@ -186,6 +194,13 @@ class Serializer(base.Serializer): def queryset_iterator(obj, field): query_set = getattr(obj, field.name).select_related(None).only("pk") + if not query_set.totally_ordered: + current_ordering = ( + query_set.query.order_by + or query_set.model._meta.ordering + or [] + ) + query_set = query_set.order_by(*current_ordering, "pk") chunk_size = 2000 if query_set._prefetch_related_lookups else None return query_set.iterator(chunk_size=chunk_size) -- cgit v1.3