使用Flask-SQLAlchemy时多对多遇到问题,请帮忙看看

谢谢大家。
代码如下,总是会提示这个错误:

sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Problem.tags - there are no foreign keys linking these tables via secondary table 'problem_tags'.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify 'primaryjoin' and 'secondaryjoin' expressions.
tags_table = db.Table('problem_tags',
    db.Column('problem_id', db.Integer, db.ForeignKey('problem.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('problemtag.id'))
    )
class ProblemTag(db.Model):
    id=db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String(80))
    problems = db.relationship('Problem',secondary=tags_table,
                           backref=db.backref('tags', lazy='dynamic'))
    def __init__(self,name):
        self.name=name

    def __repr__(self):
        return "<Tag %r>" % self.name

class Problem(db.Model):
    id=db.Column(db.Integer, primary_key=True)
    title=db.Column(db.String(80))
    tags = db.relationship('ProblemTag',secondary=tags_table,
                           backref=db.backref('problems', lazy='dynamic'))

    def __init__(self,title,tags):
        self.title=title
        self.tags=tags

    def __repr__(self):
        return "<Problem %r>" % self.title
阅读 4.2k
2 个回答

你的问题好像是problemtag.id找不到外码,这个是因为 Flask-SQLAlchemy 创建的实际表的名称不是problemtag, 而是problem_tag,可以在表中通过 __tablename__来指定表的名称。
另外多对多关系,只需要定义一边就可以了。

tags_table = db.Table('problem_tags',
                      db.Column('problem_id', db.Integer, db.ForeignKey('problem.id')),
                      db.Column('tag_id', db.Integer, db.ForeignKey('problemtag.id'))
)


class ProblemTag(db.Model):
    __tablename__ = 'problemtag'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    problems = db.relationship('Problem', secondary=tags_table,
                               backref=db.backref('tags', lazy='dynamic'))

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "<Tag %r>" % self.name


class Problem(db.Model):
    __tablename__ = 'problem'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))


    def __init__(self, title, tags):
        self.title = title
        self.tags = tags

    def __repr__(self):
        return "<Problem %r>" % self.title

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题