flask-数据模型的外键关系

SQL数据库中,两个表之间的关系表现为外键.在SQLAlchemy的模型中,也可以表现这种模型之间的关联关系.

 

 
  1. class Role(db.Model):

  2. __tablename__='roles'

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

  4. name = db.Column(db.String(64),unique=True)

  5. users = db.relationship('User',backref='role')

  6.  
  7. def __repr__(self):

  8. return '<Role %s>'%self.name

  9. class User(db.Model):

  10. __tablename__='users'

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

  12. name=db.Column(db.String(64),unique=True)

  13. role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))

  14. def __repr__(self):

  15. return '<User %s>'%self.name


        我们先分析User模型中的下面这段代码:

role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))

        很容易理解,这是在User表中创建了一个名叫role_id的字段,并把它设置成外键,然后把外键关联成roles表中的id字段.需要注意的时这里用的roles.id,roles是我们在Role模型中定义的__tablename__. 这是SQL数据库中一般设置外键的方法.

 

        接下来,看Role模型中的这段代码:

 

users = db.relationship('User',backref='role')

        在标准的SQL数据中,我们设置外键时往往只需要在要设置外键的表中添加外键,而不需要在被关联表中进行任何操作.但是在SQLAlchemy建模中,我们看到还需要在被关联的模型Role中添加关系.这其实是面向对象的思想,这里的的新建了一个名叫users的属性用来表示当前角色中包含的用户列表.users被定义成一个db.relationship对象,该对象的构造函数由两部分组成:

 

第一部分 —— 'User'表示关系的另一端模型的名称.

第二部分 —— 是一个名叫backref的参数,叫做反向关系,我们将其设置成'role',它会像User模型中添加一个名叫做role的属性,这个属性可以替代role_id访问Role模型,但是它获取的是Role模型的对象,而非Role模型对应的id的值。

下面我们重点验证并解释第二部分讲的内容:

 

 
  1. >>>from test.py import Role,User

  2. >>>r=Role(id=1,name='admin')

  3. >>>u=User(id=10,name='Hyman',role_id=1)

  4. >>>r.users.append(u)

  5. >>>print u.role

  6. <Role admin>


        第一行是引入我们定义的Role和User模型;第二行和第三行分别定义了一个Role和User实例;最重要的是第四行,我们将u添加到r的users(users实际上是一个list)列表中,这样我们同时也在u中添加了一个名叫做role的属性,而这属性就是我们定义的r对象.这就是所谓的可以用role代替role_id访问Role模型,但是它获取的是Role模型对象而非器对应的id的值...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值