summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/attributes.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-05-12 09:26:03 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-05-12 09:26:03 -0400
commit71a858817cb8c11451ae577c61329f4239fab46b (patch)
tree14fcd7fa0facf6f772280e0aea42d7124aeca509 /lib/sqlalchemy/orm/attributes.py
parentf6329060f1b2f5631deac3ca877c2ae19e3e6f36 (diff)
downloadsqlalchemy-71a858817cb8c11451ae577c61329f4239fab46b.tar.gz
Create new event for collection add w/o mutation
Fixed issue when using :paramref:`_orm.relationship.cascade_backrefs` parameter set to ``False``, which per :ref:`change_5150` is set to become the standard behavior in SQLAlchemy 2.0, where adding the item to a collection that uniquifies, such as ``set`` or ``dict`` would fail to fire a cascade event if the object were already associated in that collection via the backref. This fix represents a fundamental change in the collection mechanics by introducing a new event state which can fire off for a collection mutation even if there is no net change on the collection; the action is now suited using a new event hook :meth:`_orm.AttributeEvents.append_wo_mutation`. Fixes: #6471 Change-Id: Ic50413f7e62440dad33ab84838098ea62ff4e815
Diffstat (limited to 'lib/sqlalchemy/orm/attributes.py')
-rw-r--r--lib/sqlalchemy/orm/attributes.py6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py
index 05b12dda2..105a9cfd2 100644
--- a/lib/sqlalchemy/orm/attributes.py
+++ b/lib/sqlalchemy/orm/attributes.py
@@ -1389,6 +1389,12 @@ class CollectionAttributeImpl(AttributeImpl):
return value
+ def fire_append_wo_mutation_event(self, state, dict_, value, initiator):
+ for fn in self.dispatch.append_wo_mutation:
+ value = fn(state, value, initiator or self._append_token)
+
+ return value
+
def fire_pre_remove_event(self, state, dict_, initiator):
"""A special event used for pop() operations.