【问题标题】:flask-sqlalchemy: how to define the 'comment' model (multi foreign keys referring to the same table)?flask-sqlalchemy:如何定义“评论”模型(引用同一个表的多个外键)?
【发布时间】:2015-02-04 13:51:54
【问题描述】:

我正在开发一个视频共享网站,用户可以在其中评论视频,或评论其他人的评论。这是我简化的用户模型和评论模型:

class User(db.Model):
    __tablename__ = 'users'
    id              = db.Column(db.Integer, primary_key=True)
    username        = db.Column(db.String(MAX_USERNAME), unique=True)
    comments        = db.relationship('Comment', backref='replier', lazy='dynamic')
    replied         = db.relationship('Comment', backref='repliee', lazy='dynamic')

class Comment(db.Model):
    __tablename__ = 'comments'
    id              = db.Column(db.Integer, primary_key=True)
    content         = db.Column(db.Text)
    replier_id      = db.Column(db.Integer, db.ForeignKey('users.id'), index=True)
    repliee_id      = db.Column(db.Integer, db.ForeignKey('users.id'), index=True)
    video_id        = db.Column(db.Integer, db.ForeignKey('videos.id'), index=True)

它提示我错误:

无法确定关系 User.cmets 上的父/子表之间的连接条件 - 有多个外键路径链接这些表。指定“foreign_keys”参数,提供那些列的列表,这些列应该被视为包含对父表的外键引用

有人可以帮忙吗?烧瓶和 sqlalchemy 的新手。

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy


    【解决方案1】:

    comments 和replied 关系不知道要使用Comment 上的哪个外键列,因为replier_id 和repliee_id 都引用users.id。

    所以将适当的foreign_keys 参数添加到comments 和replied:

    comments = db.relationship('Comment', backref='replier', lazy='dynamic', foreign_keys='[Comment.replier_id]')
    replied = db.relationship('Comment', backref='repliee', lazy='dynamic', foreign_keys='[Comment.repliee_id]')
    

    【讨论】:

    • 谢谢,它有效。关于 sqlalchemy 设计的另一个问题:为什么在relationship 中,与之相关的类使用字符串,如我的示例中的'Comment',但在foreign_keys 中,它使用直接引用:Comment.replier_id 或Comment.repliee_id?不知道是不是故意这样设计的,还是随意设计的。
    • 在这两种情况下都将接受字符串或引用。使用字符串,所引用的模型不必在此时定义。我想保持一致会更好。
    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2021-07-02
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2013-06-03
    • 2014-09-21
    • 2015-02-24
    相关资源
    最近更新 更多