def _handle_o2m_related_field(self, related_field: Field, alias_object: Model): try: reverse_o2m_accessor_name = related_field.get_accessor_name() except AttributeError: # get_accessor_name does not exist for <django.contrib.contenttypes.fields.GenericRelation> reverse_o2m_accessor_name = related_field.get_attname() try: o2m_accessor_name = related_field.field.name except AttributeError: o2m_accessor_name = related_field.name for obj in getattr(alias_object, reverse_o2m_accessor_name).all(): try: logger.debug(f'Attempting to set o2m field {o2m_accessor_name} on ' f'{obj._meta.model.__name__}[pk={obj.pk}] to ' f'{self.model_meta.model_name}[pk={self.primary_object.pk}] ...') setattr(obj, o2m_accessor_name, self.primary_object) obj.validate_unique() obj.save() logger.debug('success.') except ValidationError as e: logger.debug(f'failed. {e}') if related_field.field.null: logger.debug(f'Setting o2m field {o2m_accessor_name} on ' f'{obj._meta.model.__name__}[pk={obj.pk}] to `None`') setattr(obj, o2m_accessor_name, None) obj.save() else: logger.debug(f'Deleting {obj._meta.model.__name__}[pk={obj.pk}]') obj.delete() self.modified_related_objects.append(obj)
def _handle_o2m_related_field(self, related_field: Field, alias_object: Model): reverse_o2m_accessor_name = related_field.get_accessor_name() o2m_accessor_name = related_field.field.name for obj in getattr(alias_object, reverse_o2m_accessor_name).all(): try: logger.debug( f'Attempting to set o2m field {o2m_accessor_name} on ' f'{obj._meta.model.__name__}[pk={obj.pk}] to ' f'{self.model_meta.model_name}[pk={self.primary_object.pk}] ...' ) setattr(obj, o2m_accessor_name, self.primary_object) obj.validate_unique() obj.save() logger.debug('success.') except ValidationError as e: logger.debug(f'failed. {e}') if related_field.field.null: logger.debug( f'Setting o2m field {o2m_accessor_name} on ' f'{obj._meta.model.__name__}[pk={obj.pk}] to `None`') setattr(obj, o2m_accessor_name, None) obj.save() else: logger.debug( f'Deleting {obj._meta.model.__name__}[pk={obj.pk}]') _pk = obj.pk obj.delete() obj.pk = _pk # pk is cached and re-assigned to keep the audit trail in tact self.modified_related_objects.append(obj)
def _handle_o2m_related_field(self, related_field: Field, alias_object: Model): reverse_o2m_accessor_name = related_field.get_accessor_name() o2m_accessor_name = related_field.field.name for obj in getattr(alias_object, reverse_o2m_accessor_name).all(): #logger.debug(f'Setting o2m field {o2m_accessor_name} on {obj._meta.model.__name__}[pk={obj.pk}] ' # f'to {self.model_meta.model_name}[pk={self.primary_object.pk}]') setattr(obj, o2m_accessor_name, self.primary_object) obj.save()
def _handle_m2m_related_field(self, related_field: Field, alias_object: Model): try: m2m_accessor_name = related_field.get_attname() except AttributeError: # get_attname does not exist for reverse m2m relations m2m_accessor_name = related_field.get_accessor_name() for obj in getattr(alias_object, m2m_accessor_name).all(): logger.debug(f'Removing {obj._meta.model.__name__}[pk={obj.pk}] ' f'from {self.model_meta.model_name}[pk={alias_object.pk}].{m2m_accessor_name}') getattr(alias_object, m2m_accessor_name).remove(obj) logger.debug(f'Adding {obj._meta.model.__name__}[pk={obj.pk}] ' f'to {self.model_meta.model_name}[pk={self.primary_object.pk}].{m2m_accessor_name}') getattr(self.primary_object, m2m_accessor_name).add(obj) self.modified_related_objects.append(obj)
def _handle_o2m_related_field(self, related_field: Field, alias_object: Model): if isinstance(related_field, GenericRelation): fields = related_field.remote_field.model._meta.private_fields matching_field = [f for f in fields if related_field._is_matching_generic_foreign_key(f)][0] reverse_o2m_accessor_name = related_field.get_attname() o2m_accessor_name = matching_field.name else: reverse_o2m_accessor_name = related_field.get_accessor_name() o2m_accessor_name = related_field.field.name for obj in getattr(alias_object, reverse_o2m_accessor_name).all(): try: logger.debug(f'Attempting to set o2m field {o2m_accessor_name} on ' f'{obj._meta.model.__name__}[pk={obj.pk}] to ' f'{self.model_meta.model_name}[pk={self.primary_object.pk}] ...') setattr(obj, o2m_accessor_name, self.primary_object) obj.validate_unique() obj.save() logger.debug('success.') except ValidationError as e: logger.debug(f'failed. {e}') if self.raise_validation_exception: raise if related_field.field.null: logger.debug(f'Setting o2m field {o2m_accessor_name} on ' f'{obj._meta.model.__name__}[pk={obj.pk}] to `None`') setattr(obj, o2m_accessor_name, None) obj.save() else: logger.debug(f'Deleting {obj._meta.model.__name__}[pk={obj.pk}]') _pk = obj.pk obj.delete() obj.pk = _pk # pk is cached and re-assigned to keep the audit trail in tact self.modified_related_objects.append(obj)