def __set__(self, obj, value, initiator=True, moving=None): self.init(obj) current_value = self._get(obj) if current_value and current_value == value: return if initiator and self.opposite: opposite_property = getattr(value.__class__, self.opposite, _marker) if opposite_property is not _marker: opposite_property.add(value, obj, False) if current_value: self.remove(obj, current_value) setattr(obj, self.key, ref(value))
def add(self, obj, value, initiator=True, moving=None): if value is None: return self.init(obj) current_values, need_cleanup = self._get(obj) if need_cleanup: self._cleanup(obj) if self.isunique and value in current_values: return if initiator and self.opposite: opposite_property = getattr(value.__class__, self.opposite, _marker) if opposite_property is not _marker: opposite_property.add(value, obj, False) obj.__dict__[self.key].append(ref(value))
def remove(self, obj, values, initiator=True, moving=None): self.init(obj) relations = obj.__dict__[self.key] if not isinstance(values, (list, tuple, set)): values = [values] for value in values: if initiator and self.opposite: opposite_property = getattr(value.__class__, self.opposite, _marker) if opposite_property is not _marker: opposite_property.remove(value, obj, False) value_ref = ref(value) if value_ref in relations: relations.remove(value_ref) elif value in relations: relations.remove(value)
def remove(self, obj, values, initiator=True, moving=None): self.init(obj) relations = obj.__dict__[self.key] if not isinstance(values, (list, tuple, set)): values = [values] for value in values: if initiator and self.opposite: opposite_property = getattr( value.__class__, self.opposite, _marker) if opposite_property is not _marker: opposite_property.remove(value, obj, False) value_ref = ref(value) if value_ref in relations: relations.remove(value_ref) elif value in relations: relations.remove(value)