From: Mike Bayer Date: Mon, 19 Nov 2007 08:30:52 +0000 (+0000) Subject: - fixed endless loop issue when using lazy="dynamic" on both X-Git-Tag: rel_0_4_2~156 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=569c9fa65ab0a6d7a5bf6d12996940c53cbcf345;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - fixed endless loop issue when using lazy="dynamic" on both sides of a bi-directional relationship [ticket:872] --- diff --git a/CHANGES b/CHANGES index d8ed8746f3..a44c402b5d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,14 @@ ======= CHANGES ======= +0.4.2 +----- + +- orm + - fixed endless loop issue when using lazy="dynamic" on both + sides of a bi-directional relationship [ticket:872] + 0.4.1 ----- diff --git a/lib/sqlalchemy/orm/dynamic.py b/lib/sqlalchemy/orm/dynamic.py index 993756edeb..44eaaa2815 100644 --- a/lib/sqlalchemy/orm/dynamic.py +++ b/lib/sqlalchemy/orm/dynamic.py @@ -47,12 +47,12 @@ class DynamicAttributeImpl(attributes.AttributeImpl): def append(self, state, value, initiator): if initiator is not self: self.get_history(state)._added_items.append(value) - self.fire_append_event(state, value, self) + self.fire_append_event(state, value, initiator) def remove(self, state, value, initiator): if initiator is not self: self.get_history(state)._deleted_items.append(value) - self.fire_remove_event(state, value, self) + self.fire_remove_event(state, value, initiator) class AppenderQuery(Query): diff --git a/test/orm/dynamic.py b/test/orm/dynamic.py index 0bb253b198..fa8828c20a 100644 --- a/test/orm/dynamic.py +++ b/test/orm/dynamic.py @@ -9,7 +9,7 @@ from query import QueryTest class DynamicTest(FixtureTest): keep_mappers = False - keep_data = True + refresh_data = True def test_basic(self): mapper(User, users, properties={ @@ -36,7 +36,23 @@ class DynamicTest(FixtureTest): def go(): assert [User(id=7, addresses=[Address(id=1, email_address='jack@bean.com')])] == q.filter(User.id==7).all() self.assert_sql_count(testbase.db, go, 2) - + + def test_m2m(self): + mapper(Order, orders, properties={ + 'items':relation(Item, secondary=order_items, lazy="dynamic", backref=backref('orders', lazy="dynamic")) + }) + mapper(Item, items) + + sess = create_session() + o1 = Order(id=15, description="order 10") + i1 = Item(id=10, description="item 8") + o1.items.append(i1) + sess.save(o1) + sess.flush() + + assert o1 in i1.orders.all() + assert i1 in o1.items.all() + class FlushTest(FixtureTest): def test_basic(self): class Fixture(Base):