Skip to content

Commit f0fad6d

Browse files
authored
Merge pull request #2485 from janste63/fix_2484
Test case and proposed solution for #2484
2 parents 1669f0c + da173cf commit f0fad6d

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,3 +259,4 @@ that much better:
259259
* Agustin Barto (https://github.com/abarto)
260260
* Stankiewicz Mateusz (https://github.com/mas15)
261261
* Felix Schultheiß (https://github.com/felix-smashdocs)
262+
* Jan Stein (https://github.com/janste63)

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changelog
77
Development
88
===========
99
- (Fill this out as you fix issues and develop your features).
10+
- Bug fix: ignore LazyReferenceFields when clearing _changed_fields #2484
1011
- Improve connection doc #2481
1112

1213
Changes in 0.23.0

mongoengine/base/document.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,9 @@ def _nestable_types_changed_fields(changed_fields, base_key, data):
615615
def _get_changed_fields(self):
616616
"""Return a list of all fields that have explicitly been changed."""
617617
EmbeddedDocument = _import_class("EmbeddedDocument")
618+
LazyReferenceField = _import_class("LazyReferenceField")
618619
ReferenceField = _import_class("ReferenceField")
620+
GenericLazyReferenceField = _import_class("GenericLazyReferenceField")
619621
GenericReferenceField = _import_class("GenericReferenceField")
620622
SortedListField = _import_class("SortedListField")
621623

@@ -641,7 +643,13 @@ def _get_changed_fields(self):
641643
changed_fields += [f"{key}{k}" for k in changed if k]
642644
elif isinstance(data, (list, tuple, dict)):
643645
if hasattr(field, "field") and isinstance(
644-
field.field, (ReferenceField, GenericReferenceField)
646+
field.field,
647+
(
648+
LazyReferenceField,
649+
ReferenceField,
650+
GenericLazyReferenceField,
651+
GenericReferenceField,
652+
),
645653
):
646654
continue
647655
elif isinstance(field, SortedListField) and field._ordering:

tests/fields/test_lazy_reference_field.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,26 @@ class Book(Document):
375375
assert isinstance(ref.author, LazyReference)
376376
assert isinstance(ref.author.id, ObjectId)
377377

378+
def test_lazy_reference_in_list_with_changed_element(self):
379+
class Animal(Document):
380+
name = StringField()
381+
tag = StringField()
382+
383+
class Ocurrence(Document):
384+
in_list = ListField(LazyReferenceField(Animal))
385+
386+
Animal.drop_collection()
387+
Ocurrence.drop_collection()
388+
389+
animal1 = Animal(name="doggo").save()
390+
391+
animal1.tag = "blue"
392+
393+
occ = Ocurrence(in_list=[animal1]).save()
394+
animal1.save()
395+
assert isinstance(occ.in_list[0], LazyReference)
396+
assert occ.in_list[0].pk == animal1.pk
397+
378398

379399
class TestGenericLazyReferenceField(MongoDBTestCase):
380400
def test_generic_lazy_reference_simple(self):

0 commit comments

Comments
 (0)