diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/serializers/python.py | 17 | ||||
| -rw-r--r-- | django/core/serializers/xml_serializer.py | 17 |
2 files changed, 32 insertions, 2 deletions
diff --git a/django/core/serializers/python.py b/django/core/serializers/python.py index 53a73e19e5..73ba24368b 100644 --- a/django/core/serializers/python.py +++ b/django/core/serializers/python.py @@ -77,7 +77,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: @@ -86,6 +94,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) 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) |
