我的另一篇文章里讲述了relationship一对多的使用以及原理,这篇则讲述一下多对多的使用。
relationship多对多的使用
多对多是什么?
如何描述一对多呢? 其实两个一对多的相互引用就是多对多。例如,一个用户可以发表很多篇博客,但是一个网站的博客却可以是多个用户发表。就是两个一对多的相互引用。
多对多的关系,一般在数据库里如何表示?
一般通过一个中间表来关联。 比如一个支付宝的消费记录表, 要记录用户的用户id, 商品的商品id, 以及时间戳,下单的设备id等。 这样就能通过这个中间表同时关联了用户表和商品表。
relaitonship 在多对多中如何使用?
其实relaitonship 就是一个虚拟主键。 可以两个一对多的一里, 新建一个字段,去关联那个中间表。语法如下:
class Users(db.Model):
...(非必要的字段就不显示了)
# 这里第一个参数是模型名, 第二个参数是给模型插入的虚拟主键字段名, 第三个参数是 存储多对多关系的中间表(不是模型名)
goods = db.relationship('Goods', backref='user_list', secondary='user_goods')
不能同时存在两边relationship的互相引用,写了上面的, 就不能用下面的。
class Goods(db.Model):
...(非必要的字段就不显示了)
# 这里第一个参数是模型名, 第二个参数是给模型插入的虚拟主键字段名, 第三个参数是 存储多对多关系的中间表(不是模型名)不能同时两边都存在relationship
# users = db.relationship('Users', backref='good_list', secondary='user_goods')
class UserGoods(db.Model):
# 可以指定表名
__tablename= 'user_goods'
# 默认模型名小写就是表名, 除非自己在创建的时候指定表名, 这里要有外键约束关系
uid = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
gid = db.Column(db.Integer, db.ForeignKey('goods.id'), nullable=False)
...