首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自指多瓶炼金

自指多瓶炼金
EN

Stack Overflow用户
提问于 2015-06-02 22:25:53
回答 1查看 2.2K关注 0票数 10

对于我的生活,我无法理解为什么这个自我参照的多对多的人会不快乐:

代码语言:javascript
复制
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。

我还将添加一个永久挂起的版本。你会看到,我一直在重写变量名,只是一遍又一遍地重写它,希望如果我重新尝试一下,我会在第二次或第五次更聪明一些。

代码语言:javascript
复制
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'))
EN

回答 1

Stack Overflow用户

发布于 2015-06-03 02:20:58

你试过这样做吗?

代码语言:javascript
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30607680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档