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.

Reply via email to