From e866a89b17b792b205f2522f2940b019a55cc7dc Mon Sep 17 00:00:00 2001 From: yujin <891837834@qq.com> Date: Tue, 31 Aug 2021 17:53:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=AF=B9=E4=BA=8E=E5=B5=8C=E5=A5=97=E5=90=AB?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E7=9A=84=E5=AF=B9=E8=B1=A1=E4=BC=9A=E5=A4=9A?= =?UTF-8?q?=E6=AC=A1=E8=B0=83=E7=94=A8=E7=9B=B8=E5=90=8C=E7=9A=84clean?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=B8=85=E9=99=A4=E5=A4=9A=E6=AC=A1=EF=BC=8C?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E9=AB=98=E5=B9=B6=E5=8F=91=E4=B8=8B=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E6=96=87=E6=A1=A3=E6=80=A7=E8=83=BD=E6=9A=B4=E8=B7=8C?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mongoengine/base/document.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 46935c1b8..c2fc48d1c 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -520,13 +520,14 @@ def _mark_as_changed(self, key): if field.startswith(level): remove(field) - def _clear_changed_fields(self): + def _clear_changed_fields(self, cache_obj=None): """Using _get_changed_fields iterate and remove any fields that are marked as changed. """ ReferenceField = _import_class("ReferenceField") GenericReferenceField = _import_class("GenericReferenceField") - + if cache_obj is None: + cache_obj = set() for changed in self._get_changed_fields(): parts = changed.split(".") data = self @@ -541,7 +542,9 @@ def _clear_changed_fields(self): else: field_name = data._reverse_db_field_map.get(part, part) data = getattr(data, field_name, None) - + if id(data) in cache_obj: + continue + cache_obj.add(id(data)) if not isinstance(data, LazyReference) and hasattr( data, "_changed_fields" ): @@ -554,12 +557,12 @@ def _clear_changed_fields(self): data.field, (ReferenceField, GenericReferenceField) ): continue - BaseDocument._nestable_types_clear_changed_fields(data) + BaseDocument._nestable_types_clear_changed_fields(data, cache_obj) self._changed_fields = [] @staticmethod - def _nestable_types_clear_changed_fields(data): + def _nestable_types_clear_changed_fields(data, cache_obj): """Inspect nested data for changed fields :param data: data to inspect for changes @@ -577,9 +580,12 @@ def _nestable_types_clear_changed_fields(data): if hasattr(value, "_get_changed_fields") and not isinstance( value, Document ): # don't follow references - value._clear_changed_fields() + value._clear_changed_fields(cache_obj) elif isinstance(value, (list, tuple, dict)): - BaseDocument._nestable_types_clear_changed_fields(value) + if id(data) in cache_obj: + continue + cache_obj.add(id(data)) + BaseDocument._nestable_types_clear_changed_fields(value, cache_obj) @staticmethod def _nestable_types_changed_fields(changed_fields, base_key, data):