From 054713d6443b0a15df88991998696c975af79332 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 5 Dec 2006 03:16:35 +0000 Subject: [PATCH] made backrefs aware of "post_update" and "viewonly" so it doesnt have to be explicitly propigated; also backrefs shouldnt fire off in a post_update situation. --- lib/sqlalchemy/orm/dependency.py | 18 ++++++++++-------- lib/sqlalchemy/orm/properties.py | 2 ++ test/orm/cycles.py | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index 133d51b7fc..5b95b4d7ac 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -115,10 +115,11 @@ class DependencyProcessor(object): class OneToManyDP(DependencyProcessor): def register_dependencies(self, uowcommit): if self.post_update: - stub = MapperStub(self.parent, self.mapper, self.key) - uowcommit.register_dependency(self.mapper, stub) - uowcommit.register_dependency(self.parent, stub) - uowcommit.register_processor(stub, self, self.parent) + if not self.is_backref: + stub = MapperStub(self.parent, self.mapper, self.key) + uowcommit.register_dependency(self.mapper, stub) + uowcommit.register_dependency(self.parent, stub) + uowcommit.register_processor(stub, self, self.parent) else: uowcommit.register_dependency(self.parent, self.mapper) uowcommit.register_processor(self.parent, self, self.parent) @@ -204,10 +205,11 @@ class OneToManyDP(DependencyProcessor): class ManyToOneDP(DependencyProcessor): def register_dependencies(self, uowcommit): if self.post_update: - stub = MapperStub(self.parent, self.mapper, self.key) - uowcommit.register_dependency(self.mapper, stub) - uowcommit.register_dependency(self.parent, stub) - uowcommit.register_processor(stub, self, self.parent) + if not self.is_backref: + stub = MapperStub(self.parent, self.mapper, self.key) + uowcommit.register_dependency(self.mapper, stub) + uowcommit.register_dependency(self.parent, stub) + uowcommit.register_processor(stub, self, self.parent) else: uowcommit.register_dependency(self.mapper, self.parent) uowcommit.register_processor(self.mapper, self, self.parent) diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 959c7675e0..af98c12cd7 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -306,6 +306,8 @@ class BackRef(object): sj = self.kwargs.pop('secondaryjoin', None) # the backref property is set on the primary mapper parent = prop.parent.primary_mapper() + self.kwargs.setdefault('viewonly', prop.viewonly) + self.kwargs.setdefault('post_update', prop.post_update) relation = PropertyLoader(parent, prop.secondary, pj, sj, backref=prop.key, is_backref=True, **self.kwargs) mapper._compile_property(self.key, relation); elif not isinstance(mapper.props[self.key], PropertyLoader): diff --git a/test/orm/cycles.py b/test/orm/cycles.py index 5ec0426489..7f7e1ada94 100644 --- a/test/orm/cycles.py +++ b/test/orm/cycles.py @@ -496,7 +496,7 @@ class OneToManyManyToOneTest(AssertMixin): Ball.mapper = mapper(Ball, ball) Person.mapper = mapper(Person, person, properties= dict( - balls = relation(Ball.mapper, primaryjoin=ball.c.person_id==person.c.id, foreignkey=ball.c.person_id, private=True, post_update=True), + balls = relation(Ball.mapper, primaryjoin=ball.c.person_id==person.c.id, foreignkey=ball.c.person_id, private=True, post_update=True, backref='person'), favorateBall = relation(Ball.mapper, primaryjoin=person.c.favorite_ball_id==ball.c.id, foreignkey=person.c.favorite_ball_id), ) ) -- 2.47.2