SQLAlchemy - 自引用与额外列的多对多关系

时间:2014-08-07 08:17:39

标签: python database database-design sqlalchemy flask-sqlalchemy

我有一个代表用户的模型,我想在表示他们是朋友的用户之间创建关系。我的功能模型与关联表和列出所有朋友的方法看起来像这样

friendship = db.Table('friend',
    db.Column('id', db.Integer, primary_key=True),
    db.Column('fk_user_from', db.Integer, db.ForeignKey('user.id'), nullable=False),
    db.Column('fk_user_to', db.Integer, db.ForeignKey('user.id'), nullable=False)
)

class User(db.Model):
   ...
   ...
   friends = db.relationship('User',
        secondary=friendship,
        primaryjoin=(friendship.c.fk_user_from==id),
        secondaryjoin=(friendship.c.fk_user_to==id),
        backref = db.backref('friend', lazy = 'dynamic'), 
        lazy = 'dynamic')

    def list_friends(self):
        friendship_union = db.select([
                        friendship.c.fk_user_from, 
                        friendship.c.fk_user_to
                        ]).union(
                            db.select([
                                friendship.c.fk_user_to, 
                                friendship.c.fk_user_from]
                            )
                    ).alias()
        User.all_friends = db.relationship('User',
                       secondary=friendship_union,
                       primaryjoin=User.id==friendship_union.c.fk_user_from,
                       secondaryjoin=User.id==friendship_union.c.fk_user_to,
                       viewonly=True) 
        return self.all_friends

问题是我需要在确认之前实施询问友情和待审状态(就像你从Facebook上知道的那样)所以在附件栏中添加一个额外的列是必要的。根据{{​​3}}我应该创建一个关联对象,但是如何让它再次自我引用呢?

或者是否可以将此列添加到我当前的友情表中并以某种方式访问​​并更改状态值?

由于

2 个答案:

答案 0 :(得分:4)

您只需要在表中添加primaryjoin,并在友谊表中创建两个外键,'primary_key'也是如此。你还需要在课堂上建立友谊。

class Friendship(db.Model):
    __tablename__ = 'friend'
    fk_user_from = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    fk_user_to = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    extra_field = db.Column(db.Integer)


class User (db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    user_to = db.relationship('Friendship',backref='to', primaryjoin=id==Friendship.fk_user_to)
    user_from = db.relationship('Friendship',backref='from', primaryjoin=id==Friendship.fk_user_from )

要添加朋友,您需要定义友谊,例如:

friend = Friendship(extra_field=0 , to=me , from=my_friend)

答案 1 :(得分:1)

我已经回答了一个类似的问题,该问题解决了与关联对象之间的自指多对多关系。

请参见https://stackoverflow.com/a/62281276/9387542

此外,如果您只想建立友谊模型,我建议您与https://stackoverflow.com/a/7317251/9387542

中的模型建立多对多关系