Test case and proposed solution for #2484

This commit is contained in:
Jan Stein 2021-03-03 14:58:03 +01:00
parent 2d1c9afbb7
commit 8fd969aba9
4 changed files with 31 additions and 1 deletions

View File

@ -259,3 +259,4 @@ that much better:
* Agustin Barto (https://github.com/abarto) * Agustin Barto (https://github.com/abarto)
* Stankiewicz Mateusz (https://github.com/mas15) * Stankiewicz Mateusz (https://github.com/mas15)
* Felix Schultheiß (https://github.com/felix-smashdocs) * Felix Schultheiß (https://github.com/felix-smashdocs)
* Jan Stein (https://github.com/janste63)

View File

@ -7,6 +7,7 @@ Development
=========== ===========
- (Fill this out as you fix issues and develop your features). - (Fill this out as you fix issues and develop your features).
- Bugfix: manually setting SequenceField in DynamicDocument doesn't increment the counter #2471 - Bugfix: manually setting SequenceField in DynamicDocument doesn't increment the counter #2471
- Bug fix: ignore LazyReferenceFields when clearing _changed_fields #2484
Changes in 0.22.1 Changes in 0.22.1
================= =================

View File

@ -615,7 +615,9 @@ class BaseDocument:
def _get_changed_fields(self): def _get_changed_fields(self):
"""Return a list of all fields that have explicitly been changed.""" """Return a list of all fields that have explicitly been changed."""
EmbeddedDocument = _import_class("EmbeddedDocument") EmbeddedDocument = _import_class("EmbeddedDocument")
LazyReferenceField = _import_class("LazyReferenceField")
ReferenceField = _import_class("ReferenceField") ReferenceField = _import_class("ReferenceField")
GenericLazyReferenceField = _import_class("GenericLazyReferenceField")
GenericReferenceField = _import_class("GenericReferenceField") GenericReferenceField = _import_class("GenericReferenceField")
SortedListField = _import_class("SortedListField") SortedListField = _import_class("SortedListField")
@ -641,7 +643,13 @@ class BaseDocument:
changed_fields += [f"{key}{k}" for k in changed if k] changed_fields += [f"{key}{k}" for k in changed if k]
elif isinstance(data, (list, tuple, dict)): elif isinstance(data, (list, tuple, dict)):
if hasattr(field, "field") and isinstance( if hasattr(field, "field") and isinstance(
field.field, (ReferenceField, GenericReferenceField) field.field,
(
LazyReferenceField,
ReferenceField,
GenericLazyReferenceField,
GenericReferenceField,
),
): ):
continue continue
elif isinstance(field, SortedListField) and field._ordering: elif isinstance(field, SortedListField) and field._ordering:

View File

@ -375,6 +375,26 @@ class TestLazyReferenceField(MongoDBTestCase):
assert isinstance(ref.author, LazyReference) assert isinstance(ref.author, LazyReference)
assert isinstance(ref.author.id, ObjectId) assert isinstance(ref.author.id, ObjectId)
def test_lazy_reference_in_list_with_changed_element(self):
class Animal(Document):
name = StringField()
tag = StringField()
class Ocurrence(Document):
in_list = ListField(LazyReferenceField(Animal))
Animal.drop_collection()
Ocurrence.drop_collection()
animal1 = Animal(name="doggo").save()
animal1.tag = "blue"
occ = Ocurrence(in_list=[animal1]).save()
animal1.save()
assert isinstance(occ.in_list[0], LazyReference)
assert occ.in_list[0].pk == animal1.pk
class TestGenericLazyReferenceField(MongoDBTestCase): class TestGenericLazyReferenceField(MongoDBTestCase):
def test_generic_lazy_reference_simple(self): def test_generic_lazy_reference_simple(self):