python - How do you use the `secondary` kwarg to fit this situation in SqlAlchemy? -
i have situation user can belong many courses, , course can contain many users. have modeled in sqlalchemy so:
class user(base): __tablename__ = 'users' id = column(integer, primary_key=true) class course(base): __tablename__ = 'courses' id = column(integer, primary_key=true) archived = column(datetime) class coursejoin(base): __tablename__ = 'course_joins' id = column(integer, primary_key=true) # foreign keys user_id = column(integer, foreignkey('users.id')) course_id = column(integer, foreignkey('courses.id')) in system, have ability "archive" course. marked datetime field on course model. give user model relationship called course_joins contains coursejoins respective course hasn't been archived. i'm trying use secondary kwarg accomplish so:
class user(base): __tablename__ = 'users' id = column(integer, primary_key=true) course_joins = relationship('coursejoin', secondary='join(course, coursejoin.course_id == course.id)', primaryjoin='and_(coursejoin.user_id == user.id,' 'course.archived == none)', order_by='coursejoin.created') however i'm getting error:
invalidrequesterror: 1 or more mappers failed initialize - can't proceed initialization of other mappers. original exception was: expression expected i believe exact usecase secondary kwarg of relationship(), i'm not sure what's going on.
if have many-to-many relationship (plus created) column, think right way define relationship is:
courses = relationship( 'course', secondary='course_joins', primaryjoin='users.c.id == course_joins.c.user_id', secondaryjoin='and_(courses.c.id == course_joins.c.course_id, courses.c.archived == none)', order_by='course_joins.c.created', viewonly=true, ) and use like:
u1 = user(courses=[course()]) session.add(u1) u2 = user(courses=[course(archived=datetime.date(2013, 1, 1))]) session.add(u2) otherwise, drop secondary , add other condition primaryjoin:
courses = relationship( 'coursejoin', primaryjoin=\ 'and_(users.c.id == course_joins.c.user_id, ' 'courses.c.id == course_joins.c.course_id, ' 'courses.c.archived == none)', order_by='course_joins.c.created', )
Comments
Post a Comment