I hope this makes sense, what I'm trying to do here. My naive first try at it was to just see if I could have the desired backref()s on either the A or C class, and manage to have the relationship go through the associationproxy. Probably I should be thinking of a technical reason why we would not expect that to work. So then I thought maybe the backrefs just need to be on the relationships defined on the B class. The above post was my third try, where I attempted to just make the whole setup symmetrical between A and C.
On Mar 14, 4:44 pm, Eric Ongerth <ericonge...@gmail.com> wrote: > from sqlalchemy import Unicode, Integer, Column, create_engine, > ForeignKey > from sqlalchemy.orm import relationship, Session > from sqlalchemy.orm.collections import MappedCollection > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy.ext.associationproxy import association_proxy > import operator > > class Base(object): > id = Column(Integer, primary_key=True) > > Base = declarative_base(cls=Base) > > def _create_c_by_value(value): > return C(value) > > def _create_a_by_value(value): > return A(value) > > class A(Base): > __tablename__ = "a" > id = Column(Integer, primary_key=True) > value = Column(Unicode) > associations = relationship("B", cascade="all") > c_values = association_proxy("associations", "c_val", > creator=_create_c_by_value) > > def __init__(self, val): > self.value = val > > def __repr__(self): > return('<A>(%s)' % self.value) > > class B(Base): > __tablename__ = "b" > a_id = Column(Integer, ForeignKey("a.id"), nullable=False) > c_id = Column(Integer, ForeignKey("c.id"), nullable=False) > c_elements = relationship("C", cascade="all") > c_val = association_proxy("c_elements", "value") > a_elements = relationship("A", cascade="all") > a_val = association_proxy("a_elements", "value") > > class C(Base): > __tablename__ = "c" > id = Column(Integer, primary_key=True) > c_value = Column(Unicode) > associations = relationship("B", cascade="all") > a_values = association_proxy("associations", "a_val", > creator=_create_a_by_value) > > def __init__(self, val): > self.value = val > > def __repr__(self): > return('<C>(%s)' % self.value) > > if __name__ == "__main__": > > engine = create_engine('sqlite://', echo=True) > Base.metadata.create_all(engine) > session = Session(engine) > > Ok, running this sets up an example environment then you can > experiment. Try creating some As and relating them to some Cs. I'm > getting a bunch of different errors doing this. What am I doing wrong > or overlooking? > > The core of my inquiry is this: would this be the way to make two-way > relationships between two classes (two classes which have a many:many > relationship between them) work correctly when tunneled through an > associationproxy to hide the association object class between them? -- 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 sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.