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.