diff options
-rw-r--r-- | CHANGES | 5 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 2 | ||||
-rw-r--r-- | test/ext/test_declarative.py | 19 |
3 files changed, 24 insertions, 2 deletions
@@ -16,6 +16,11 @@ CHANGES restore_snapshot() is called a second time, discarding those changes. [ticket:2389] + - [bug] Fixed regression from 0.7.4 whereby + using an already instrumented column from a + superclass as "polymorphic_on" failed to resolve + the underlying Column. [ticket:2345] + - [feature] Added "class_registry" argument to declarative_base(). Allows two or more declarative bases to share the same registry of class names. diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 13b5b3e47..4c952c1fd 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -128,7 +128,7 @@ class Mapper(object): self.batch = batch self.eager_defaults = eager_defaults self.column_prefix = column_prefix - self.polymorphic_on = polymorphic_on + self.polymorphic_on = expression._clause_element_as_expr(polymorphic_on) self._dependency_processors = [] self.validators = util.immutabledict() self.passive_updates = passive_updates diff --git a/test/ext/test_declarative.py b/test/ext/test_declarative.py index 3069c2bfe..69042b5c8 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -1,6 +1,6 @@ from test.lib.testing import eq_, assert_raises, \ - assert_raises_message + assert_raises_message, is_ from sqlalchemy.ext import declarative as decl from sqlalchemy import exc import sqlalchemy as sa @@ -1855,6 +1855,23 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): eq_(sess.query(Engineer).filter_by(primary_language='cobol' ).one(), Engineer(name='vlad', primary_language='cobol')) + def test_polymorphic_on_converted_from_inst(self): + class A(Base): + __tablename__ = 'A' + id = Column(Integer, primary_key=True) + discriminator = Column(String) + + @declared_attr + def __mapper_args__(cls): + return { + 'polymorphic_identity': cls.__name__, + 'polymorphic_on': cls.discriminator + } + + class B(A): + pass + is_(B.__mapper__.polymorphic_on, A.__table__.c.discriminator) + def test_add_deferred(self): class Person(Base, fixtures.ComparableEntity): |