- The proper error message is raised when trying to access
expired instance attributes with no session present
-
+
+ - dynamic_loader() / lazy="dynamic" now accepts and uses
+ the order_by parameter in the same way in which it works
+ with relation().
+
- Added expire_all() method to Session. Calls expire() for
all persistent instances. This is handy in conjunction
with...
def dynamic_loader(argument, secondary=None, primaryjoin=None, secondaryjoin=None, entity_name=None,
foreign_keys=None, backref=None, post_update=False, cascade=None, remote_side=None, enable_typechecks=True,
- passive_deletes=False):
+ passive_deletes=False, order_by=None):
"""construct a dynamically-loading mapper property.
This property is similar to relation(), except read operations
return PropertyLoader(argument, secondary=secondary, primaryjoin=primaryjoin,
secondaryjoin=secondaryjoin, entity_name=entity_name, foreign_keys=foreign_keys, backref=backref,
post_update=post_update, cascade=cascade, remote_side=remote_side, enable_typechecks=enable_typechecks,
- passive_deletes=passive_deletes,
+ passive_deletes=passive_deletes, order_by=order_by,
strategy_class=DynaLoader)
#def _relation_loader(mapper, secondary=None, primaryjoin=None, secondaryjoin=None, lazy=True, **kwargs):
from sqlalchemy.orm.mapper import has_identity, object_mapper
class DynamicAttributeImpl(attributes.AttributeImpl):
- def __init__(self, class_, key, typecallable, target_mapper, **kwargs):
+ def __init__(self, class_, key, typecallable, target_mapper, order_by, **kwargs):
super(DynamicAttributeImpl, self).__init__(class_, key, typecallable, **kwargs)
self.target_mapper = target_mapper
+ self.order_by=order_by
def get(self, state, passive=False):
if passive:
except exceptions.InvalidRequestError:
raise exceptions.UnboundExecutionError("Parent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed" % (mapperutil.instance_str(instance), self.attr.key))
- return sess.query(self.attr.target_mapper).with_parent(instance, self.attr.key)
+ q = sess.query(self.attr.target_mapper).with_parent(instance, self.attr.key)
+ if self.attr.order_by:
+ q = q.order_by(self.attr.order_by)
+ return q
def assign(self, collection):
instance = self.instance
class DynaLoader(AbstractRelationLoader):
def init_class_attribute(self):
self.is_class_level = True
- self._register_attribute(self.parent.class_, dynamic=True, target_mapper=self.parent_property.mapper)
+ self._register_attribute(self.parent.class_, dynamic=True, target_mapper=self.parent_property.mapper, order_by=self.parent_property.order_by)
def create_row_processor(self, selectcontext, mapper, row):
return (None, None, None)
sess = create_session()
u = sess.query(User).get(8)
self.assertEquals(list(u.addresses.order_by(desc(Address.email_address))), [Address(email_address=u'ed@wood.com'), Address(email_address=u'ed@lala.com'), Address(email_address=u'ed@bettyboop.com')])
+
+ def test_configured_order_by(self):
+ mapper(User, users, properties={
+ 'addresses':dynamic_loader(mapper(Address, addresses), order_by=desc(Address.email_address))
+ })
+ sess = create_session()
+ u = sess.query(User).get(8)
+ self.assertEquals(list(u.addresses), [Address(email_address=u'ed@wood.com'), Address(email_address=u'ed@lala.com'), Address(email_address=u'ed@bettyboop.com')])
def test_count(self):
mapper(User, users, properties={