diff --git a/docs/changelog.rst b/docs/changelog.rst index 71f9ac5d..d543b169 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,7 @@ Changelog Development =========== - (Fill this out as you fix issues and develop your features). +- Fixed a bug that made the queryset drop the read_preference after clone(). Changes in 0.20.0 ================= diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index f755a05c..875cbfda 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -800,6 +800,7 @@ class BaseQuerySet: "_snapshot", "_timeout", "_read_preference", + "_read_concern", "_iter", "_scalar", "_as_pymongo", @@ -1324,10 +1325,11 @@ class BaseQuerySet: final_pipeline = initial_pipeline + user_pipeline collection = self._collection - if self._read_preference is not None: + if self._read_preference is not None or self._read_concern is not None: collection = self._collection.with_options( - read_preference=self._read_preference + read_preference=self._read_preference, read_concern=self._read_concern ) + return collection.aggregate(final_pipeline, cursor={}, **kwargs) # JS functionality diff --git a/tests/queryset/test_queryset.py b/tests/queryset/test_queryset.py index aece69bf..36da5d74 100644 --- a/tests/queryset/test_queryset.py +++ b/tests/queryset/test_queryset.py @@ -4053,6 +4053,32 @@ class TestQueryset(unittest.TestCase): Number.drop_collection() + def test_clone_retains_settings(self): + """Ensure that cloning retains the read_preference and read_concern + """ + + class Number(Document): + n = IntField() + + Number.drop_collection() + + qs = Number.objects + qs_clone = qs.clone() + assert qs._read_preference == qs_clone._read_preference + assert qs._read_concern == qs_clone._read_concern + + qs = Number.objects.read_preference(ReadPreference.PRIMARY_PREFERRED) + qs_clone = qs.clone() + assert qs._read_preference == ReadPreference.PRIMARY_PREFERRED + assert qs._read_preference == qs_clone._read_preference + + qs = Number.objects.read_concern({"level": "majority"}) + qs_clone = qs.clone() + assert qs._read_concern.document == {"level": "majority"} + assert qs._read_concern == qs_clone._read_concern + + Number.drop_collection() + def test_using(self): """Ensure that switching databases for a queryset is possible """