python - self referential many to many flask-sqlalchemy -
i life of me cannot figure out why self-referential many-to-many not happy:
minor_contains = db.table( 'minor_contains', db.column('parent_id', db.integer, db.foreignkey('minors.id'), primary_key=true), db.column('contains_id', db.integer, db.foreignkey('minors.id'), primary_key=true)) class minor(db.model): __tablename__ = 'minors' id = db.column(db.integer, primary_key=true) name = db.column(db.string()) ... contains = db.relationship( "minor", secondary=minor_contains, primaryjoin="id == minor_contains.c.parent_id", secondaryjoin="id == minor_contains.c.contains_id", backref="contained_by", lazy='dynamic')
i've tried reworking few different ways based on examples i've seen sqlalchemy , flask-sqlalchemy, consistently end either following error message or end in infinite loop somewhere.
e argumenterror: not locate simple equality expressions involving locally mapped foreign key columns primary join condition 'minor_contains.parent_id = :parent_id_1' on relationship minor.contains. ensure referencing columns associated foreignkey or foreignkeyconstraint, or annotated in join condition foreign() annotation. allow comparison operators other '==', relationship can marked viewonly=true.
update
i'm failing understand error message because shows column join table being compared itself, condition on join should pk of minors table compared fk in join table.
i'll add version of hangs forever. you'll see i've been reworking variable names , such rewriting on , on hoping if take fresh stab @ it, i'll somehow smarter second or fifth time around.
minor_contains = db.table( 'minor_contains', db.column('parent_minor_id', db.integer, db.foreignkey('minors.id'), primary_key=true), db.column('contains_minor_id', db.integer, db.foreignkey('minors.id'), primary_key=true)) class minor(db.model): __tablename__ = 'minors' id = db.column(db.integer, primary_key=true) name = db.column(db.string()) ... contains = db.relationship( "minor", secondary=minor_contains, primaryjoin=id==minor_contains.c.parent_minor_id, secondaryjoin=id==minor_contains.c.contains_minor_id, backref=db.backref("minor_contains", lazy='dynamic'))
i think it's necessary specify model name in join conditions.
contains = db.relationship( "minor", secondary=minor_contains, primaryjoin="minor.id == minor_contains.c.parent_id", secondaryjoin="minor.id == minor_contains.c.contains_id", backref=db.backref('minor_contains', lazy='dynamic'), lazy='dynamic')
i had same issue , fixed problem. found useful answer here : link
Comments
Post a Comment