Hi,

I'm trying to use load_only and joinedload on a relationship 
model.Asset.parent. The parent relation is polymorphic and can be either 
Task or Project with the common Base class called Context.

        import sqlalchemy.orm
        import sqlalchemy.inspection

        entity = model.session.query(
            model.Asset
        ).options(
            sqlalchemy.orm.joinedload('parent').load_only(
                'context_type', 'name', 'link'
            )
        ).first()

        state = sqlalchemy.inspection.inspect(entity.parent)
        for attribute in state.attrs:
            is_loaded = (
                attribute.loaded_value is not
                sqlalchemy.orm.base.NO_VALUE
            )
            if is_loaded:
                print attribute.key

# Output:
id
taskid
name
context_type


The id, name and context_type is from Context. And taskid is primary key on 
the taskid and is a foreignkey to the context.id. As you can see "name" 
loads fine but "link" attribute is not loaded. The "link" column is added 
as a column_property to Context using a __declare_last__. 

These are simplified versions of the classes:


class Context(Base):
    '''Represent a context.'''
    context_type = Column(Unicode(32), nullable=False)
    
    __mapper_args__ = {
        'polymorphic_on': context_type,
        'polymorphic_identity': 'context'
    }

    name = Column(Unicode(255), default=u'', nullable=False)

    @declared_attr
    def id(cls):
        return Column(CHAR(36), primary_key=True, default=lambda: str(uuid
()))

    @classmethod
    def __declare_last__(cls):
        '''Return link expression query.'''
        
        ...

        cls.link = column_property(
            sqlalchemy.type_coerce(
                query, LinkTypeDecorator
            ).label('link')
        )

class Task(Context):
    '''Represent a task.'''

    taskid = Column(
        types.CHAR(36),
        ForeignKey('context.id'),
        primary_key=True
    )

    __mapper_args__ = {
        'polymorphic_identity': 'task'
    }


class Asset(Base):
    '''Represent an Asset.'''

    context_id = sqlalchemy.Column(
        sqlalchemy.CHAR(36), sqlalchemy.ForeignKey('context.id')
    )

    parent = relationship('Context', backref=backref('assets'))


Can you see if I'm doing something wrong?

-- 
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