Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
================
Expand Down
15 changes: 7 additions & 8 deletions mongoengine/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 25 additions & 0 deletions tests/document/test_instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
):
Expand Down