relationship多对多的使用


我的另一篇文章里讲述了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)
    ...

文章作者: 陌上人如玉
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陌上人如玉 !
  目录