you need to specify primaryjoin and secondary join when you do self ref using m2m. there's an example at the end of http://www.sqlalchemy.org/docs/orm/relationships.html#specifying-alternate-join-conditions-to-relationship , as well as some variants of that syntax which declarative introduces.
On Sep 30, 2010, at 3:15 PM, Julien Iguchi-Cartigny wrote: > Hi, > > I've two classes CourseSet and CanonicalCourse (with the same parent) > which need to be connected in a many-to-many relationship. But these > classes are mapped on the same table, thus definition of the > association table seems redondant: > > assoc_course_set_canonical_table = Table( > 'CM_COURSE_SET_CANON_ASSOC_T', Base.metadata, > Column('CANON_COURSE', Integer, > ForeignKey('CM_MEMBER_CONTAINER_T.MEMBER_CONTAINER_ID')), > Column('COURSE_SET', Integer, > ForeignKey('CM_MEMBER_CONTAINER_T.MEMBER_CONTAINER_ID')) > ) > > But i can't define the relationship between. I've the error: > > Could not determine join condition between parent/child tables on > relationship CourseSet.canonicalCourses. Specify a 'primaryjoin' > expression. If 'secondary' is present, 'secondaryjoin' is needed as > well. > > I must have miss something: i've tried several possibilities with > primaryjoin and secondaryjoin but nothing work. Is it because i'm > refering at the same foreign key in the associative table ? > > Thank you. > > Julien. > > PS: The code for my two classes ('#' comments the two lines with the problem) > > class CourseSet(AbstractContainer): > parent_id = Column('PARENT_COURSE_SET', Integer, > ForeignKey('CM_MEMBER_CONTAINER_T.ENTERPRISE_ID')) > children = relationship("CourseSet", backref=backref('parent', > remote_side=AbstractContainer.eid)) > # canonicalCourses = relationship("CanonicalCourse", > # secondary="assoc_course_set_canonical_table") > > @classproperty > def __mapper_args__(self): > args = dict() > args.update(AbstractContainer.__mapper_args__) > args.update({'polymorphic_identity': > 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'}) > return args > > class CanonicalCourse(AbstractContainer): > > @classproperty > def __mapper_args__(self): > args = dict() > args.update(AbstractContainer.__mapper_args__) > args.update({'polymorphic_identity': > 'org.sakaiproject.coursemanagement.impl.CanonicalCourseCmImpl'}) > return args > > PS: the parents of these classes: > > class AbstractPersistent(object): > version = Column('VERSION', Integer) > last_modified_by = Column('LAST_MODIFIED_BY', String(255)) > last_modified_date = Column('LAST_MODIFIED_DATE', Date) > created_by = Column('CREATED_BY', String(255)) > created_date = Column('CREATED_DATE', Date) > > class AbstractNamed(AbstractPersistent): > eid = Column('ENTERPRISE_ID', String(255)) > title = Column('TITLE', String(255)) > description = Column('DESCRIPTION', String(255)) > > class AbstractContainer(Base,AbstractNamed): > __tablename__ = 'CM_MEMBER_CONTAINER_T' > id = Column('MEMBER_CONTAINER_ID',Integer,primary_key=True) > discriminator = Column('CLASS_DISCR', String(100)) > __mapper_args__ = {'polymorphic_on': discriminator } > > > > -- > "Trouble-a-cat limited" > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.