SQLAlchemy中如何理解‘自关联多对多’模型

本文介绍使用 Flask 和 SQLAlchemy 实现用户关注关系的多对多自关联模型。通过定义用户表和用户关系表,实现用户间的关注与被关注功能。代码展示了如何创建模型、添加数据及自关联关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

from flask_sqlalchemy import SQLAlchemy

from flask import Flask



app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:ccc@127.0.0.1:3306/many2many'

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

app.config['SQLALCHEMY_ECHO'] = False



db = SQLAlchemy(app)

tb_user_follows = db.Table(

    'tb_user_follows',

    db.Column('follower_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),

    db.Column('followed_id', db.Integer, db.ForeignKey('user.id'), primary_key=True)

)



class User(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(32), unique=True, nullable=False)

    # 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人;加个括号会比较容易理解,同理secondaryjoin也是这样

    followers = db.relationship('User', secondary=tb_user_follows,

                                primaryjoin=(id == tb_user_follows.c.followed_id),

                                secondaryjoin=id == tb_user_follows.c.follower_id,

                                backref = db.backref('followed', lazy='dynamic'),

                                lazy= 'dynamic'

                                )



if __name__ == '__main__':

    db.drop_all()

    db.create_all()

    u1 = User(name='cc')

    u2 = User(name='ccdefans')

    u3 = User(name='superstar')

    u4 = User(name='ccdefans2')



    u1.followers = [u2, u4]

    u3.followers = [u1, u2, u4]



    db.session.add_all([u1, u2, u3, u4])

    db.session.commit()



    db.session.commit()

    app.run(debug=True)

添加数据后,查看两张表单,即可看到一张存储的是用户,一张存储的是用户关系表。

用户关系的字段顺序可以更改,但其指向的引用是自关联多对多的索引

 

这个是数据表

 

这个是多对多自关联关系表,可以很清晰地看出字段是如何引用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值