Recursively finds all db references to be dereferenced :param items: The iterable (dict, list, queryset) :param depth: The current depth of recursion :param instance: The owning instance used for tracking changes by :class:`~mongoengine.base.ComplexBaseF
(self, items, depth=0, instance=None, name=None)
| 207 | return object_map |
| 208 | |
| 209 | def _attach_objects(self, items, depth=0, instance=None, name=None): |
| 210 | """ |
| 211 | Recursively finds all db references to be dereferenced |
| 212 | |
| 213 | :param items: The iterable (dict, list, queryset) |
| 214 | :param depth: The current depth of recursion |
| 215 | :param instance: The owning instance used for tracking changes by |
| 216 | :class:`~mongoengine.base.ComplexBaseField` |
| 217 | :param name: The name of the field, used for tracking changes by |
| 218 | :class:`~mongoengine.base.ComplexBaseField` |
| 219 | """ |
| 220 | if not items: |
| 221 | if isinstance(items, (BaseDict, BaseList)): |
| 222 | return items |
| 223 | |
| 224 | if instance: |
| 225 | if isinstance(items, dict): |
| 226 | return BaseDict(items, instance, name) |
| 227 | else: |
| 228 | return BaseList(items, instance, name) |
| 229 | |
| 230 | if isinstance(items, (dict, SON)): |
| 231 | if "_ref" in items: |
| 232 | return self.object_map.get( |
| 233 | (items["_ref"].collection, items["_ref"].id), items |
| 234 | ) |
| 235 | elif "_cls" in items: |
| 236 | doc = get_document(items["_cls"])._from_son(items) |
| 237 | _cls = doc._data.pop("_cls", None) |
| 238 | del items["_cls"] |
| 239 | doc._data = self._attach_objects(doc._data, depth, doc, None) |
| 240 | if _cls is not None: |
| 241 | doc._data["_cls"] = _cls |
| 242 | return doc |
| 243 | |
| 244 | if not hasattr(items, "items"): |
| 245 | is_list = True |
| 246 | list_type = BaseList |
| 247 | if isinstance(items, EmbeddedDocumentList): |
| 248 | list_type = EmbeddedDocumentList |
| 249 | as_tuple = isinstance(items, tuple) |
| 250 | iterator = enumerate(items) |
| 251 | data = [] |
| 252 | else: |
| 253 | is_list = False |
| 254 | iterator = items.items() |
| 255 | data = {} |
| 256 | |
| 257 | depth += 1 |
| 258 | for k, v in iterator: |
| 259 | if is_list: |
| 260 | data.append(v) |
| 261 | else: |
| 262 | data[k] = v |
| 263 | |
| 264 | if k in self.object_map and not is_list: |
| 265 | data[k] = self.object_map[k] |
| 266 | elif isinstance(v, (Document, EmbeddedDocument)): |