From 2b77adf8e83d4665759d9115a906602ca67ed024 Mon Sep 17 00:00:00 2001 From: Bastien Gerard Date: Sun, 30 Aug 2026 16:00:33 +0200 Subject: [PATCH] Fix reload leaving inconsistencies when unsetting fields with custom db field name --- docs/changelog.rst | 1 + mongoengine/document.py | 15 +++++++-------- tests/document/test_instance.py | 25 +++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 3ada301b1..3e677a48b 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,6 +7,7 @@ Changelog Development =========== - (Fill this out as you fix issues and develop your features). +- Fix partial ``Document.reload()`` leaving custom ``db_field`` values marked as changed. Changes in 1.0.0 ================ diff --git a/mongoengine/document.py b/mongoengine/document.py index 01a55cdc3..e333b528e 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -814,14 +814,13 @@ def reload(self, *fields, **kwargs): # i.e. obj.update(unset__field=1) followed by obj.reload() delattr(self, field) - self._changed_fields = ( - list(set(self._changed_fields) - set(fields)) - if fields - else obj._changed_fields - ) - self._unset_fields = ( - list(set(self._unset_fields) - set(fields)) if fields else obj._unset_fields - ) + if fields: + reloaded_fields = {self._translate_field_name(field) for field in fields} + self._changed_fields = list(set(self._changed_fields) - reloaded_fields) + self._unset_fields = list(set(self._unset_fields) - reloaded_fields) + else: + self._changed_fields = obj._changed_fields + self._unset_fields = obj._unset_fields self._has_change_tracking_baseline = True self._created = False return self diff --git a/tests/document/test_instance.py b/tests/document/test_instance.py index 53ad5bf96..9b4d3b672 100644 --- a/tests/document/test_instance.py +++ b/tests/document/test_instance.py @@ -650,6 +650,31 @@ class User(Document): assert user.phone == "01234" assert user.vital_signs.blood_pressure == 0.99 + def test_reload__field_with_db_field_was_unset__clears_updated_fields(self): + class User(Document): + display_name = StringField(db_field="displayName") + + User.drop_collection() + + user = User(display_name="Alice").save() + del user.display_name + + assert user._get_updated_fields() == ([], ["displayName"]) + + user.reload("display_name") + + assert user.display_name == "Alice" + assert user._get_updated_fields() == ([], []) + assert user._delta() == ({}, {}) + + User.objects(id=user.id).update_one(set__display_name="Bob") + user.save() + + assert get_as_pymongo(user) == { + "_id": user.id, + "displayName": "Bob", + } + def test_save__reference_and_embedded_fields_are_deleted__unsets_whole_fields( self, ):