开发者学堂课程【Python Web 框架 Flask 快速入门:数据库的基本操作2-关系引用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/603/detail/8798
数据库的基本操作2-关系引用
目录
一、模型之间的关联
二、关键代码
一、模型之间的关联
一对多
class Role( db.Model)
:
…
#关键代码
user = db.relationship('User' , backref='role')
…
class User (db.Model):
…
role_id = db.Column(db.Integer, db.ForeignKey('roles.id '))
其中 realtionship 描述了 Role 和 User 的关系。在此文中,第一个参数为对应参照的类 "User"
第二个参数 backref 为类 User 申明新属性的方法
表格:
Role |
|
|
|
|
role_id主题 |
role_name 唯一 |
Users |
|
仅仅是为了方便查询,需要一些属性便利的去查询数据。但是这些属性不能出现在数据库的字段中 |
1 |
管理员 |
张三、李四 |
|
|
2 |
管理用户 |
王五 |
|
|
User |
|
|
|
直接通过 user 查询出用户所属的角色名 |
user_id |
user_name |
role_id 多的一方:外键 |
role |
|
1 |
张三 |
1 |
管理员 |
1.需要先查询出role_id |
2 |
李四 |
1 |
管理员 |
2.根据 role_id 去另一张表查询 |
3 |
王五 |
2 |
普通用户 |
二、关键代码
class Role(db.Model):
#定义表名
__tablename__= ’roles'
#定义字段
#db.Column表示是一个字段
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String (16), unique=True)
#在一的一方,写关联
# users = db.relationship('User'):表示和User模型发生了关联,增加了一个users属性#backref='role':表示role是User要用的属性
users = db.relationship('User' , backref='role')
#rqpr()方法显示一个可读字符串
def__repr__ (self):
return '' %( self.name,self.id)
class User(db.Model) :
__tablename__ = 'users’
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
email = db.Column(db.String(32), unique=True)
password = db.column (db.String(32))
#db.ForeignKey ('roles.id')表示是外键. 表名.id
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
# User希望有role属性,但是这个属性的定义,需要在另一个模型中定义
def ___repr__(self) :
return '' % (self.name,self.id,self.email,self.password)
在终端输入exit退出,输入ipython重新导入代码,在Pycharm中写入为:
…
In [1]: from Flask_sQLalchemy_demo import*
添加一个角色和两个用户
In [2]: role = Role(name='admin')
In [3]: db.session.add(role)
In [4]: db.session.commit()
In [5]: user1 = User(name='zs', role_id=role.id)
In [6]: user2 = User(name='ls', role_id=role.id)
In [7]: db.session.add_all([user1,user2])
In [8]: db.session.commit()
实现关系引用查询
In [9]: role.users
out[9]:[,]
In [10]: user1.role
out[10]:
In [11]: user2.role.name
out[11]: u'admin'
…