From: Chris Withers Date: Mon, 1 Mar 2010 18:10:23 +0000 (+0000) Subject: allow __tablename__ to come from a mixin X-Git-Tag: rel_0_6beta2~81 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8aaf3da70a0b1beb3e9ca36d15e37454e3bfa958;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git allow __tablename__ to come from a mixin --- diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index 65c9df1333..12b79c7965 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -546,6 +546,9 @@ def _as_declarative(cls, classname, dict_): dict_[name]=column_copies[obj]=obj.copy() mapper_args = mapper_args or getattr(base,'__mapper_args__',mapper_args) table_args = table_args or getattr(base,'__table_args__',None) + tablename = getattr(base,'__tablename__',None) + if tablename: + dict_['__tablename__']=tablename # make sure that column copies are used rather than the original columns # from any mixins diff --git a/test/ext/test_declarative.py b/test/ext/test_declarative.py index de608e76ae..a22a9581ea 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -1846,6 +1846,49 @@ class DeclarativeMixinTest(DeclarativeTestBase): eq_(obj.foo(),'bar1') eq_(obj.baz,'fu') + def test_table_name_inherited(self): + + class MyMixin: + @classproperty + def __tablename__(cls): + return cls.__name__.lower() + id = Column(Integer, primary_key=True) + + class MyModel(Base,MyMixin): + pass + + eq_(MyModel.__table__.name,'mymodel') + + def test_table_name_not_inherited(self): + + class MyMixin: + @classproperty + def __tablename__(cls): + return cls.__name__.lower() + id = Column(Integer, primary_key=True) + + class MyModel(Base,MyMixin): + __tablename__ = 'overridden' + + eq_(MyModel.__table__.name,'overridden') + + def test_table_name_inheritance_order(self): + + class MyMixin1: + @classproperty + def __tablename__(cls): + return cls.__name__.lower()+'1' + + class MyMixin2: + @classproperty + def __tablename__(cls): + return cls.__name__.lower()+'2' + + class MyModel(Base,MyMixin1,MyMixin2): + id = Column(Integer, primary_key=True) + + eq_(MyModel.__table__.name,'mymodel1') + def test_table_args_inherited(self): class MyMixin: