- [bug] Fixed bug whereby hybrid_property didn't
work as a kw arg in any(), has().
+ - [feature] Added "class_registry" argument to
+ declarative_base(). Allows two or more declarative
+ bases to share the same registry of class names.
+
- Py3K
- [bug] Fixed inappropriate usage of util.py3k
flag and renamed it to util.py3k_warning, since
def declarative_base(bind=None, metadata=None, mapper=None, cls=object,
name='Base', constructor=_declarative_constructor,
+ class_registry=None,
metaclass=DeclarativeMeta):
"""Construct a base class for declarative class definitions.
no __init__ will be provided and construction will fall back to
cls.__init__ by way of the normal Python semantics.
+ :param class_registry: optional dictionary that will serve as the
+ registry of class names-> mapped classes when string names
+ are used to identify classes inside of :func:`.relationship`
+ and others. Allows two or more declarative base classes
+ to share the same registry of class names for simplified
+ inter-base relationships.
+
:param metaclass:
Defaults to :class:`.DeclarativeMeta`. A metaclass or __metaclass__
compatible callable to use as the meta type of the generated
if bind:
lcl_metadata.bind = bind
+ if class_registry is None:
+ class_registry = {}
+
bases = not isinstance(cls, tuple) and (cls,) or cls
- class_dict = dict(_decl_class_registry=dict(),
+ class_dict = dict(_decl_class_registry=class_registry,
metadata=lcl_metadata)
if constructor:
assert class_mapper(User).get_property('props').secondary \
is user_to_prop
+ def test_shared_class_registry(self):
+ reg = {}
+ Base1 = decl.declarative_base(testing.db, class_registry=reg)
+ Base2 = decl.declarative_base(testing.db, class_registry=reg)
+
+ class A(Base1):
+ __tablename__ = 'a'
+ id = Column(Integer, primary_key=True)
+
+ class B(Base2):
+ __tablename__ = 'b'
+ id = Column(Integer, primary_key=True)
+ aid = Column(Integer, ForeignKey(A.id))
+ as_ = relationship("A")
+
+ assert B.as_.property.mapper.class_ is A
+
def test_uncompiled_attributes_in_relationship(self):
class Address(Base, fixtures.ComparableEntity):