On 5/11/15 11:16 AM, Geo wrote:
Ok, I got this working by adding the following code into the base class:
parent_lazy= relation(
'Node',
remote_side=[id],
backref=backref(
'children_lazy',
collection_class=ordering_list('position'),
order_by=[position],
cascade='all',
lazy='dynamic' )
)
The I can use node.children_lazy to get a dynamic loader. I still have
one question, am I able to add this dynamic loader by sub classing the
Node? As the base class code is from the upstream, I'm wondering if I
can have this feature without touching the base class.
If the Node is mapped using the declarative system, then subclassing it
is going to create a new mapper which links to the original using
single-table mapper inheritance. You might be able to do that, though
this would have the wrinkle that the existing self-referential
relationships on Node would still return the superclass that does not
have your attribute.
More directly would be to add the new property to the original mapper,
but that adds it to that mapping globally, the way to do that which is
agnostic of whether or not declarative is used is
"inspect(Node).add_property("children_lazy", relationship(Node, ...))".
On Monday, May 11, 2015 at 10:54:24 PM UTC+8, Michael Bayer wrote:
On 5/11/15 5:50 AM, Geo wrote:
I have a base class node:
class Node:
parent= relation(
'Node',
remote_side=[id],
backref=backref(
'children',
collection_class=ordering_list('position'),
order_by=[position],
cascade='all'
)
)
by default the node.children give me a eager loading collection,
and what I want is to have a subclass of the Node but only change
the loading to lazy='dynamic' so on the
sqlalchemy.orm.dynamic.AppenderQuery I can control the loading on
the runtime. Or If I can work on the instance level? I read
the documentation but I can't figure out setting the behaviour
for my case.
eager or lazy loading can be controlled using query loader
options, however the "dynamic" loader specifically isn't
compatible with loader options because it changes the behavior of
the attribute at the instance level using an alternate
descriptor. Just build a separate relationship that has
"dynamic" as the loader strategy and use that one when you want
that behavior.
-- You received this message because you are subscribed to the
Google Groups "sqlalchemy" group. To unsubscribe from this group
and stop receiving emails from it, send an email to
sqlalchemy+...@googlegroups.com <javascript:>. To post to this
group, send email to sqlal...@googlegroups.com <javascript:>.
Visit this group at http://groups.google.com/group/sqlalchemy
<http://groups.google.com/group/sqlalchemy>. For more options,
visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
-- You received this message because you are subscribed to the Google
Groups "sqlalchemy" group. To unsubscribe from this group and stop
receiving emails from it, send an email to
sqlalchemy+unsubscr...@googlegroups.com
<mailto:sqlalchemy+unsubscr...@googlegroups.com>. To post to this
group, send email to sqlalchemy@googlegroups.com
<mailto:sqlalchemy@googlegroups.com>. Visit this group at
http://groups.google.com/group/sqlalchemy. For more options, visit
https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.