Improved cascading saves write performance (#361)
This commit is contained in:
		| @@ -97,6 +97,14 @@ class DocumentMetaclass(type): | ||||
|         attrs['_reverse_db_field_map'] = dict( | ||||
|             (v, k) for k, v in attrs['_db_field_map'].iteritems()) | ||||
|  | ||||
|         # Set cascade flag if not set | ||||
|         if 'cascade' not in attrs['_meta']: | ||||
|             ReferenceField = _import_class('ReferenceField') | ||||
|             GenericReferenceField = _import_class('GenericReferenceField') | ||||
|             cascade = any([isinstance(x, (ReferenceField, GenericReferenceField)) | ||||
|                            for x in doc_fields.values()]) | ||||
|             attrs['_meta']['cascade'] = cascade | ||||
|  | ||||
|         # | ||||
|         # Set document hierarchy | ||||
|         # | ||||
|   | ||||
| @@ -8,6 +8,7 @@ from pymongo.read_preferences import ReadPreference | ||||
| from bson import ObjectId | ||||
| from bson.dbref import DBRef | ||||
| from mongoengine import signals | ||||
| from mongoengine.common import _import_class | ||||
| from mongoengine.base import (DocumentMetaclass, TopLevelDocumentMetaclass, | ||||
|                               BaseDocument, BaseDict, BaseList, | ||||
|                               ALLOW_INHERITANCE, get_document) | ||||
| @@ -284,15 +285,17 @@ class Document(BaseDocument): | ||||
|     def cascade_save(self, *args, **kwargs): | ||||
|         """Recursively saves any references / | ||||
|            generic references on an objects""" | ||||
|         import fields | ||||
|         _refs = kwargs.get('_refs', []) or [] | ||||
|  | ||||
|         ReferenceField = _import_class('ReferenceField') | ||||
|         GenericReferenceField = _import_class('GenericReferenceField') | ||||
|  | ||||
|         for name, cls in self._fields.items(): | ||||
|             if not isinstance(cls, (fields.ReferenceField, | ||||
|                                     fields.GenericReferenceField)): | ||||
|             if not isinstance(cls, (ReferenceField, | ||||
|                                     GenericReferenceField)): | ||||
|                 continue | ||||
|  | ||||
|             ref = getattr(self, name) | ||||
|             ref = self._data.get(name) | ||||
|             if not ref or isinstance(ref, DBRef): | ||||
|                 continue | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user