python中关系映射主要包括三种:一对多关系映射、一对一关系映射、多对多关系映射。python
一对多关系映射
一方:Student(学生)
添加关联属性和反向引用
多方:Article(文章)
添加外键关联
一对一关系映射
一方:Student(学生)主表
添加多对多的关联属性和反向引用,同时uselist取值为FALSE,表示fetchone
添加第三张表的关联属性和反向引用关系
一方:Detail(详情表)次表
添加外键关联
多对多关系映射
多方:Users
添加多对多的关联属性和反向引用,同时指明第三张关联表(2)
添加对第三张表的关联属性和反向引用(2)
多方:Goods
添加对第三张表的关联属性和反向引用(2)
第三张关联表:UsersGoods
复制代码
# 一方
class Student(db.Model):
__tablename__ = "student"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30), nullable=False)
# 增长关联属性和反向引用关系
# 关联属性:在student对象中经过哪一个属性可以获得对应的全部的article对象
# 反向引用:在article对象中经过哪一个属性可以获得它对应的student
articles = db.relationship('Article', backref="student", lazy="dynamic")
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Student:%r>" % self.name
# 多方
class Article(db.Model):
__tablename__ = "article"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30), nullable=False)
# 增长一个列(外键):引用自article表的主键,这一段代码是为了生成数据库关联。
student_id = db.Column(db.Integer, db.ForeignKey('student.id')) # 这里的student是数据库表名
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Article:%r>" % self.tname
复制代码
# 一方
class Student(db.Model):
__tablename__ = "student"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30), nullable=False)
# 增长关联属性和反向引用关系
# 关联属性:在student对象中经过哪一个属性可以获得detail信息
# 反向引用:在detail对象中经过哪一个属性可以获得它对应的student
# uselist is for the purpose of fetchone
user = db.relationship('Detail', backref='student', uselist=False)
def __init__(self, name):
self.name = name
def __repr__(self):
return "<Student:%r>" % self.name
class Detail(db.Model):
__tablename__ = 'detial'
id = db.Column(db.Integer, primary_key=True)
weight = db.Column(db.Float)
student_id = db.Column(db.Integer, db.ForeignKey('student.id'))
复制代码
class Users(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),nullable=False,unique=True)
age = db.Column(db.Integer)
email = db.Column(db.String(120),unique=True)
isActive = db.Column(db.Boolean,default=True)
# 添加多(Users)对多(Goods)的关联属性和反向引用关系
# 涉及到第三张关联表 - users_goods
goods=db.relationship(
'Goods',
secondary='users_goods',
lazy="dynamic",
backref=db.backref(
"users",
lazy='dynamic')
)
#增长对UsersGoods的关联属性和反向引用关系:目的是为了建立Users类 与 UsersGoods类 之间的关系
userGoods = db.relationship('UsersGoods',backref="user",lazy="dynamic")
class Goods(db.Model):
__tablename__ = "goods"
id = db.Column(db.Integer,primary_key=True)
gname = db.Column(db.String(80))
gprice = db.Column(db.Float)
#增长对UsersGoods类的关联属性和反向引用关系
goodUsers = db.relationship('UsersGoods',backref="good",lazy="dynamic")
# 建立 users_goods 的第三张关联表,从而来表示多对多的关系
class UsersGoods(db.Model):
__tablename__ = "users_goods"
id = db.Column(db.Integer,primary_key=True)
users_id = db.Column(db.Integer,db.ForeignKey('users.id'))
goods_id = db.Column(db.Integer,db.ForeignKey('goods.id'))
count = db.Column(db.Integer,default=1)
# user.goods
# user.userGoods
# good.users
# good.goodUsers
# goodUsers.good
# userGoods.user
复制代码