Return a list of all fields that have explicitly been changed.
(self)
| 637 | ) |
| 638 | |
| 639 | def _get_changed_fields(self): |
| 640 | """Return a list of all fields that have explicitly been changed.""" |
| 641 | EmbeddedDocument = _import_class("EmbeddedDocument") |
| 642 | LazyReferenceField = _import_class("LazyReferenceField") |
| 643 | ReferenceField = _import_class("ReferenceField") |
| 644 | GenericLazyReferenceField = _import_class("GenericLazyReferenceField") |
| 645 | GenericReferenceField = _import_class("GenericReferenceField") |
| 646 | SortedListField = _import_class("SortedListField") |
| 647 | |
| 648 | changed_fields = [] |
| 649 | changed_fields += getattr(self, "_changed_fields", []) |
| 650 | |
| 651 | for field_name in self._fields_ordered: |
| 652 | db_field_name = self._db_field_map.get(field_name, field_name) |
| 653 | key = "%s." % db_field_name |
| 654 | data = self._data.get(field_name, None) |
| 655 | field = self._fields.get(field_name) |
| 656 | |
| 657 | if db_field_name in changed_fields: |
| 658 | # Whole field already marked as changed, no need to go further |
| 659 | continue |
| 660 | |
| 661 | if isinstance(field, ReferenceField): # Don't follow referenced documents |
| 662 | continue |
| 663 | |
| 664 | if isinstance(data, EmbeddedDocument): |
| 665 | # Find all embedded fields that have been changed |
| 666 | changed = data._get_changed_fields() |
| 667 | changed_fields += [f"{key}{k}" for k in changed if k] |
| 668 | elif isinstance(data, (list, tuple, dict)): |
| 669 | if hasattr(field, "field") and isinstance( |
| 670 | field.field, |
| 671 | ( |
| 672 | LazyReferenceField, |
| 673 | ReferenceField, |
| 674 | GenericLazyReferenceField, |
| 675 | GenericReferenceField, |
| 676 | ), |
| 677 | ): |
| 678 | continue |
| 679 | elif isinstance(field, SortedListField) and field._ordering: |
| 680 | # if ordering is affected whole list is changed |
| 681 | if any(field._ordering in d._changed_fields for d in data): |
| 682 | changed_fields.append(db_field_name) |
| 683 | continue |
| 684 | |
| 685 | self._nestable_types_changed_fields(changed_fields, key, data) |
| 686 | return changed_fields |
| 687 | |
| 688 | def _delta(self): |
| 689 | """Returns the delta (set, unset) of the changes for a document. |