关系使用 relationship()
函数表示。然而外键必须用类 sqlalchemy.schema.ForeignKey
来单独声明. 这里的一对一关系使用User(用户基本资料)和UserData(用户的拓展资料),如果需要给用户的基本资料添加一写拓展资料,这种关系必须是一对一的关系。这里我们假设需要为用户添加一个邮件的拓展资料,分别定义用户User和UserData模型,并使用关系方法定义他们之间的一对一关系:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
userdata = db.relationship(
'UserData', uselist=False, back_populates='user')
class UserData(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(200))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship('User', back_populates=('userdata'))
uselist=False
标志指示在关系的“多”端放置标量属性而不是集合。将一对多转换为一对一, back_populates()
显示表明双方的对应关系,这种方法比较简单。编写测试代码:
@app.cli.command()
def test_1to1():
'''一对一测试'''
print("开始测试")
user = User()
user.name = 'baby'
db.session.add(user)
db.session.commit()
userdata = UserData()
userdata.email = 'test@qq.com'
# userdata.user_id = user.id #建立关系方法1
userdata.user = user # 建立关系方法2
db.session.add(userdata)
db.session.commit()
print("添加{}成功!".format(user.userdata.email))
添加数据的代码很简单就不解释了。 userdata.user_id = user.id
和 userdata.user = user
是两种定义关系的添加数据的方法。
终端下运行:
D:\test>flask dbinit
删除数据库和表
创建数据库!
数据库创建成功!
D:\test>flask test_1to1
开始测试
添加test@qq.com成功!