youre expressing the secondary join condition on a many-to-many as  
shoved into the primary join.  SA will be confused by that, as it  
requires knowledge of primary/secondary join conditions separately in  
order to properly construct lazy loading criterion.

Group.mapper = mapper(Group, groups, properties = {
     'members': relation(User, viewonly=True,
         secondary=membership,
         backref='groups',
         primaryjoin=and_(membership.c.level==100,  
membership.c.group_id==groups.c.id),
         secondaryjoin=membership.c.user_id==users.c.id)
})



On Jun 12, 2007, at 11:53 PM, Michael Carter wrote:

> from sqlalchemy import *
> db = create_engine('sqlite://', echo=True)
> meta = BoundMetaData(db)
> session = create_session()
>
> groups = Table("groups", meta,
>     Column("id",Integer, primary_key=True),
>     Column("name", Unicode(40)))
>
> membership = Table("membership", meta,
>     Column("user_id", Integer, ForeignKey("users.id"),  
> primary_key=True),
>     Column("group_id", Integer, ForeignKey("groups.id"),  
> primary_key=True),
>     Column("level", Integer))
>
> users = Table("users", meta,
>     Column("id", Integer, primary_key=True),
>     Column("name", Unicode(255)))
>
> class User(object):
>     def __repr__(self): return str(self)
>     def __str__(self): return "<User %s: %s>" % (self.id, self.name)
>
> class Group(object):
>     def __repr__(self): return str(self)
>     def __str__(self): return "<Group %s: %s>" % (self.id, self.name)
>
> class Membership(object):
>     def __repr__(self): return str(self)
>     def __str__(self): return "<Membership %s, %s: %s>" %  
> (self.user_id, self.group_id, self.level)
>
>
> Group.mapper = mapper(Group, groups, properties = {
>     'members': relation(User, viewonly=True,
>         secondary=membership, backref='groups',
>         primaryjoin=and_(membership.c.user_id==users.c.id,  
> membership.c.level==100, membership.c.group_id==groups.c.id)),
> })
>
> User.mapper = mapper(User, users, properties = {
> })
>
> Membership.mapper = mapper(Membership, membership, properties = {
>     'user': relation(User),
>     'group': relation(Group)
> })
>
> meta.drop_all()
> meta.create_all()
> u = User()
> g = Group()
> m = Membership()
> u.name = 'Michael Carter'
> g.name = 'Home'
> m.group = g
> m.user = u
> m.level = 100
> session.save(u)
> session.save(g)
> session.save(m)
> session.flush()
> print u.groups
> print g.members


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to