you want to flatten the scalar attributes to combine the namespace of OrgModel 
and OrgMemberModel into one.    there's no magic there you just have to proxy 
them all, here's "name":

class OrgMemberModel(Base):
    __tablename__ = 'org_member'

    user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
    org_id = Column(Integer, ForeignKey('org.id'), primary_key=True)
    active = Column(Boolean, nullable=False, default=True)
    role = Column(String(64), nullable=False, default='member')

    user = relationship('UserModel',
                    backref=backref('org_membership', cascade='all, 
delete-orphan'))

    org = relationship('OrgModel')

    name = association_proxy("org", "name")

u1 = UserModel()
u1.org_membership.append(OrgMemberModel(role='r1', org=OrgModel(name='o1')))

assert u1.org_membership[0].role == 'r1'
assert u1.org_membership[0].name == 'o1'

u1.org_membership[0].name = 'o2'
assert u1.org_membership[0].name == 'o2'



On Aug 4, 2013, at 4:03 AM, AM <ams....@gmail.com> wrote:

> On 08/03/2013 09:38 AM, Michael Bayer wrote:
>> On Aug 2, 2013, at 2:32 PM, Ams Fwd <ams....@gmail.com> wrote:
>> 
>>> Hi All.
>>> 
>>> Is there any way to transparently add the properties of the associated 
>>> object to the association proxy?
>>> 
>>> For e.g. if I have the following setup
>>> 
>>> class UserModel(Base):
>>>     name = sa.Column(sa.String(512))
>>>     orgs = association_proxy('org_member', 'org')
>>> 
>>> 
>>> class OrgModel(Base):
>>>     name = sa.Column(sa.String(256), unique=True)
>>> 
>>> class OrgMemberModel(Base):
>>>     __tablename__ = 'org_member'
>>> 
>>>     user_id = sa.Column(sa.Integer, sa.ForeignKey('user.id'),
>>>             primary_key=True)
>>>     org_id = sa.Column(sa.Integer, sa.ForeignKey('org.id'),
>>>             primary_key=True)
>>>     active = sa.Column(sa.Boolean, nullable=False, default=True)
>>>     role = sa.Column(sa.String(64), nullable=False, default='member')
>>> 
>>>     user = relationship('UserModel', backref=backref('org_membership',
>>>                     cascade='all, delete-orphan'))
>>>     org = relationship('OrgModel')
>>> 
>>> What I would like to be able to do is access the properties of the OrgModel 
>>> & OrgMemberModel via the org_membership[i] object.
>>> 
>>> Currently I have to do the following:
>>> 
>>> user.org_membership[0].organization.name
>>> user.org_membership[0].role
>>> 
>>> Ideally I would like to be able to do:
>>> 
>>> user.org_membership[0].name
>>> user.org_membership[0].role
>>> 
>>> Any help would be greatly appreciated.
>> 
>> on UserModel you'd have an association proxy from "org_membership" to "org". 
>>  Not sure what "org_member" is.
> 
> Hi Michael.
> 
> I think that is what I have. org_member is the many-to-many relation table 
> between User and Org.  org_membership in this case is the backref from the 
> relation into the user table.
> 
> My problem is that the backref (as expected) provides the relation property 
> and another property that points to the org at the other end of the relation 
> between user and org.
> 
> What I want is a technique that does not require that extra level of 
> indirection:
> 
> user->org_membership->org->org_property
> 
> and instead simply be able to do:
> 
> user->org_membership->org_property.
> 
> Thanks.
> 
> AM
> 
> -- 
> 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/groups/opt_out.
> 
> 

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to