diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-03-03 13:51:54 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-03-03 13:51:54 -0500 |
| commit | 75a3f84e5f9c3be645be2ec8906e63b27e9847e5 (patch) | |
| tree | 6185577783e17e8c73dc208af62552f05a57cb1b /lib/sqlalchemy/orm/properties.py | |
| parent | b83dd4dc2200bece2896a125be6d4f0911669d15 (diff) | |
| download | sqlalchemy-75a3f84e5f9c3be645be2ec8906e63b27e9847e5.tar.gz | |
- Improved checking for an existing backref name conflict during
mapper configuration; will now test for name conflicts on
superclasses and subclasses, in addition to the current mapper,
as these conflicts break things just as much. This is new for
0.8, but see below for a warning that will also be triggered
in 0.7.11.
- Improved the error message emitted when a "backref loop" is detected,
that is when an attribute event triggers a bidirectional
assignment between two other attributes with no end.
This condition can occur not just when an object of the wrong
type is assigned, but also when an attribute is mis-configured
to backref into an existing backref pair. Also in 0.7.11.
- A warning is emitted when a MapperProperty is assigned to a mapper
that replaces an existing property, if the properties in question
aren't plain column-based properties. Replacement of relationship
properties is rarely (ever?) what is intended and usually refers to a
mapper mis-configuration. Also in 0.7.11.
[ticket:2674]
Diffstat (limited to 'lib/sqlalchemy/orm/properties.py')
| -rw-r--r-- | lib/sqlalchemy/orm/properties.py | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index a0d8c92d1..79a1b81d3 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -816,7 +816,10 @@ class RelationshipProperty(StrategizedProperty): adapt_source=adapt_source) def __str__(self): - return str(self.parent.class_.__name__) + "." + self.key + if self.parent: + return str(self.parent.class_.__name__) + "." + self.key + else: + return "." + self.key def merge(self, session, @@ -1201,11 +1204,15 @@ class RelationshipProperty(StrategizedProperty): else: backref_key, kwargs = self.backref mapper = self.mapper.primary_mapper() - if mapper.has_property(backref_key): - raise sa_exc.ArgumentError("Error creating backref " - "'%s' on relationship '%s': property of that " - "name exists on mapper '%s'" % (backref_key, - self, mapper)) + + check = set(mapper.iterate_to_root()).\ + union(mapper.self_and_descendants) + for m in check: + if m.has_property(backref_key): + raise sa_exc.ArgumentError("Error creating backref " + "'%s' on relationship '%s': property of that " + "name exists on mapper '%s'" % (backref_key, + self, m)) # determine primaryjoin/secondaryjoin for the # backref. Use the one we had, so that |
