From: Mike Bayer Date: Sat, 25 Jul 2009 19:42:15 +0000 (+0000) Subject: - Using False or 0 as a polymorphic discriminator now X-Git-Tag: rel_0_5_6~31 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=818c9a617eafd97b05fe7c1d14e3bd7683a39e93;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Using False or 0 as a polymorphic discriminator now works on the base class as well as a subclass. [ticket:1440] --- diff --git a/CHANGES b/CHANGES index fa82928653..3ad73f5381 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,10 @@ CHANGES - Improved error message when query() is called with a non-SQL /entity expression. [ticket:1476] + + - Using False or 0 as a polymorphic discriminator now + works on the base class as well as a subclass. + [ticket:1440] - sql - Fixed a bug in extract() introduced in 0.5.4 whereby diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index ab6ff1c203..9e939c918a 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -244,7 +244,7 @@ class Mapper(object): else: self.mapped_table = self.local_table - if self.polymorphic_identity and not self.concrete: + if self.polymorphic_identity is not None and not self.concrete: self._identity_class = self.inherits._identity_class else: self._identity_class = self.class_ @@ -278,7 +278,7 @@ class Mapper(object): self._all_tables = set() self.base_mapper = self self.mapped_table = self.local_table - if self.polymorphic_identity: + if self.polymorphic_identity is not None: self.polymorphic_map[self.polymorphic_identity] = self self._identity_class = self.class_ diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py index 213f2ebf4b..d2cf50d849 100644 --- a/test/orm/inheritance/test_basic.py +++ b/test/orm/inheritance/test_basic.py @@ -72,20 +72,36 @@ class FalseDiscriminatorTest(_base.MappedTest): @classmethod def define_tables(cls, metadata): global t1 - t1 = Table('t1', metadata, Column('id', Integer, primary_key=True), Column('type', Integer, nullable=False)) + t1 = Table('t1', metadata, + Column('id', Integer, primary_key=True), + Column('type', Integer, nullable=False) + ) - def test_false_discriminator(self): + def test_false_on_sub(self): class Foo(object):pass class Bar(Foo):pass - mapper(Foo, t1, polymorphic_on=t1.c.type, polymorphic_identity=1) - mapper(Bar, inherits=Foo, polymorphic_identity=0) + mapper(Foo, t1, polymorphic_on=t1.c.type, polymorphic_identity=True) + mapper(Bar, inherits=Foo, polymorphic_identity=False) sess = create_session() - f1 = Bar() - sess.add(f1) + b1 = Bar() + sess.add(b1) sess.flush() - assert f1.type == 0 + assert b1.type is False sess.expunge_all() assert isinstance(sess.query(Foo).one(), Bar) + + def test_false_on_base(self): + class Ding(object):pass + class Bat(Ding):pass + mapper(Ding, t1, polymorphic_on=t1.c.type, polymorphic_identity=False) + mapper(Bat, inherits=Ding, polymorphic_identity=True) + sess = create_session() + d1 = Ding() + sess.add(d1) + sess.flush() + assert d1.type is False + sess.expunge_all() + assert sess.query(Ding).one() is not None class PolymorphicSynonymTest(_base.MappedTest): @classmethod