From d7e4e4fd25b533e49f04a0dc71b750b305e9253f Mon Sep 17 00:00:00 2001 From: Bastien Gerard Date: Sun, 30 Aug 2026 00:35:51 +0200 Subject: [PATCH 1/2] Fix buggy rewinding during QuerySetNoCache.__repr__ (does not affect regular QuerySet) --- docs/changelog.rst | 1 + mongoengine/queryset/queryset.py | 1 + tests/queryset/test_queryset.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 579dfc460..7fb14578f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -41,6 +41,7 @@ Changes in 1.0.0 - Fixed stacklevel of many warnings (to point places emitting the warning more accurately) - Add support for collation/hint/comment to delete/update and aggregate #2842 - BREAKING CHANGE: Remove LongField as it's equivalent to IntField since we drop support to Python2 long time ago (User should simply switch to IntField) #2309 +- BugFix - Prevent ``repr()`` from rewinding an actively iterated ``QuerySetNoCache`` #2870 - Replace MongoEngine-created ``bson.SON`` objects with built-in dictionaries, SON providing no advantages since Python 3.7 as native dict preserved insertion order. #2898 - BREAKING CHANGE: The obsolete ``slaves`` and ``is_slave`` connection options were silently ignored since 2014 and will now raise ``ConnectionFailure`` if provided #2920. - BugFix - Calling .clear on a ListField wasn't being marked as changed (and flushed to db upon .save()) #2858 diff --git a/mongoengine/queryset/queryset.py b/mongoengine/queryset/queryset.py index e0f7765b9..b3fa2a1b8 100644 --- a/mongoengine/queryset/queryset.py +++ b/mongoengine/queryset/queryset.py @@ -186,4 +186,5 @@ def __iter__(self): if queryset._iter: queryset = self.clone() queryset.rewind() + queryset._iter = True return queryset diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index fae2c0ff8..56cdebe19 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -5590,6 +5590,37 @@ class Person(Document): qs = Person.objects.no_cache() assert repr(qs) == "[]" + def test_queryset_repr__not_iterated__lists_documents(self): + class Person(Document): + name = StringField() + + def __repr__(self): + return f"" + + Person.drop_collection() + Person.objects.insert([Person(name="a"), Person(name="b")]) + + querysets = ( + Person.objects.order_by("name"), + Person.objects.order_by("name").no_cache(), + ) + for queryset in querysets: + with self.subTest(queryset_type=type(queryset).__name__): + assert repr(queryset) == "[, ]" + + def test_no_cached_queryset_repr__during_iteration__reports_without_rewinding(self): + class Person(Document): + name = StringField() + + Person.drop_collection() + Person.objects.insert([Person(name="a"), Person(name="b")]) + qs = Person.objects.order_by("name").no_cache() + iterator = iter(qs) + + assert next(iterator).name == "a" + assert repr(qs) == ".. queryset mid-iteration .." + assert next(iterator).name == "b" + def test_no_cached_on_a_cached_queryset_raise_error(self): class Person(Document): name = StringField() From 6a6a942f55aa261cd0eb10b84c11840c4e302a65 Mon Sep 17 00:00:00 2001 From: Bastien Gerard Date: Sun, 30 Aug 2026 15:47:09 +0200 Subject: [PATCH 2/2] Fix flaky test --- tests/fields/test_decimal128_field.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/fields/test_decimal128_field.py b/tests/fields/test_decimal128_field.py index 6aa2ec23e..398173c01 100644 --- a/tests/fields/test_decimal128_field.py +++ b/tests/fields/test_decimal128_field.py @@ -1,5 +1,4 @@ import json -import random from decimal import Decimal import pytest @@ -142,8 +141,8 @@ def test_storage(self): def test_json(self): Decimal128Document.drop_collection() - f = str(random.random()) - Decimal128Document(dec128_fld=f).save() + value = "9.549665900909776e-05" + Decimal128Document(dec128_fld=value).save() json_str = Decimal128Document.objects.to_json() array = json.loads(json_str) - assert array[0]["dec128_fld"] == {"$numberDecimal": str(f)} + assert array[0]["dec128_fld"] == {"$numberDecimal": "0.00009549665900909776"}