def compile(self, prop): if self.prop: return self.prop = prop mapper = prop.mapper.primary_mapper() if mapper._get_property(self.key, raiseerr=False) is None: pj = self.kwargs.pop('primaryjoin', None) sj = self.kwargs.pop('secondaryjoin', None) 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=BackRef(prop.key, _prop=prop), is_backref=True, **self.kwargs) mapper._compile_property(self.key, relation); prop._reverse_property = mapper._get_property(self.key) mapper._get_property(self.key)._reverse_property = prop else: raise exceptions.ArgumentError("Error creating backref '%s' on relation '%s': property of that name exists on mapper '%s'" % (self.key, prop, mapper))
def compile(self, prop): """Called by the owning PropertyLoader to set up a backreference on the PropertyLoader's mapper. """ # try to set a LazyLoader on our mapper referencing the parent mapper mapper = prop.mapper.primary_mapper() if not mapper.props.has_key(self.key): pj = self.kwargs.pop('primaryjoin', None) 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): raise exceptions.ArgumentError("Cant create backref '%s' on mapper '%s'; an incompatible property of that name already exists" % (self.key, str(mapper))) else: # else set one of us as the "backreference" parent = prop.parent.primary_mapper() if parent.class_ is not mapper.props[self.key]._get_target_class(): raise exceptions.ArgumentError("Backrefs do not match: backref '%s' expects to connect to %s, but found a backref already connected to %s" % (self.key, str(parent.class_), str(mapper.props[self.key].mapper.class_))) if not mapper.props[self.key].is_backref: prop.is_backref=True if not prop.viewonly: prop._dependency_processor.is_backref=True # reverse_property used by dependencies.ManyToManyDP to check # association table operations prop.reverse_property = mapper.props[self.key] mapper.props[self.key].reverse_property = prop
def compile(self, prop): """Called by the owning PropertyLoader to set up a backreference on the PropertyLoader's mapper. """ # try to set a LazyLoader on our mapper referencing the parent mapper mapper = prop.mapper.primary_mapper() if not mapper.get_property(self.key, raiseerr=False) is not None: pj = self.kwargs.pop('primaryjoin', None) 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.get_property(self.key), PropertyLoader): raise exceptions.ArgumentError( "Can't create backref '%s' on mapper '%s'; an incompatible " "property of that name already exists" % (self.key, str(mapper))) else: # else set one of us as the "backreference" parent = prop.parent.primary_mapper() if parent.class_ is not mapper.get_property( self.key)._get_target_class(): raise exceptions.ArgumentError( "Backrefs do not match: backref '%s' expects to connect to %s, " "but found a backref already connected to %s" % (self.key, str(parent.class_), str(mapper.get_property(self.key).mapper.class_))) if not mapper.get_property(self.key).is_backref: prop.is_backref = True if not prop.viewonly: prop._dependency_processor.is_backref = True # reverse_property used by dependencies.ManyToManyDP to check # association table operations prop.reverse_property = mapper.get_property(self.key) mapper.get_property(self.key).reverse_property = prop
def compile(self, prop): if self.prop: return self.prop = prop mapper = prop.mapper.primary_mapper() if mapper._get_property(self.key, raiseerr=False) is None: if prop.secondary: pj = self.kwargs.pop('primaryjoin', prop.secondaryjoin) sj = self.kwargs.pop('secondaryjoin', prop.primaryjoin) else: pj = self.kwargs.pop('primaryjoin', prop.primaryjoin) sj = self.kwargs.pop('secondaryjoin', None) if sj: raise sa_exc.InvalidRequestError( "Can't assign 'secondaryjoin' on a backref against " "a non-secondary relation.") parent = prop.parent.primary_mapper() self.kwargs.setdefault('viewonly', prop.viewonly) self.kwargs.setdefault('post_update', prop.post_update) relation = RelationProperty(parent, prop.secondary, pj, sj, backref=BackRef(prop.key, _prop=prop), _is_backref=True, **self.kwargs) mapper._compile_property(self.key, relation) prop._reverse_property = mapper._get_property(self.key) mapper._get_property(self.key)._reverse_property = prop else: raise sa_exc.ArgumentError( "Error creating backref '%s' on relation '%s': " "property of that name exists on mapper '%s'" % (self.key, prop, mapper))
def compile(self, prop): if self.prop: return self.prop = prop mapper = prop.mapper.primary_mapper() if mapper._get_property(self.key, raiseerr=False) is None: if prop.secondary: pj = self.kwargs.pop("primaryjoin", prop.secondaryjoin) sj = self.kwargs.pop("secondaryjoin", prop.primaryjoin) else: pj = self.kwargs.pop("primaryjoin", prop.primaryjoin) sj = self.kwargs.pop("secondaryjoin", None) if sj: raise sa_exc.InvalidRequestError( "Can't assign 'secondaryjoin' on a backref against " "a non-secondary relation." ) parent = prop.parent.primary_mapper() self.kwargs.setdefault("viewonly", prop.viewonly) self.kwargs.setdefault("post_update", prop.post_update) relation = RelationProperty( parent, prop.secondary, pj, sj, backref=BackRef(prop.key, _prop=prop), _is_backref=True, **self.kwargs ) mapper._compile_property(self.key, relation) prop._reverse_property = mapper._get_property(self.key) mapper._get_property(self.key)._reverse_property = prop else: raise sa_exc.ArgumentError( "Error creating backref '%s' on relation '%s': " "property of that name exists on mapper '%s'" % (self.key, prop, mapper) )