对于我的生活,我无法理解为什么这个自我参照的多对多的人会不快乐:
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')我已经尝试了几种不同的方法,基于我在SQLAlchemy和中看到的例子,但是我始终在得到以下错误消息的地方结束,或者最终在某个无限循环中结束。
E ArgumentError:无法为关系Minor.contains上的主连接条件'minor_contains.parent_id = :parent_id_1‘找到涉及本地映射的外键列的任何简单相等表达式。确保引用列与ForeignKey或ForeignKeyConstraint相关联,或在联接条件中使用foreign()注释进行注释。若要允许“==”以外的比较运算符,可以将关系标记为viewonly=True。
更新
我确实无法理解错误消息,因为它显示了join表中的列正在与其自身进行比较,其中join上的条件应该是与join表中的FK相比的未成年人表的PK。
我还将添加一个永久挂起的版本。你会看到,我一直在重写变量名,只是一遍又一遍地重写它,希望如果我重新尝试一下,我会在第二次或第五次更聪明一些。
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'))发布于 2015-06-03 02:20:58
你试过这样做吗?
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=db.backref('minor_contains', lazy='dynamic'),
lazy='dynamic')https://stackoverflow.com/questions/30607680
复制相似问题