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