Flask-SQLAlchemy学习笔记(2):一对一关系

关系使用 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 = '[email protected]'
    # 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.iduserdata.user = user 是两种定义关系的添加数据的方法。

终端下运行:

D:\test>flask dbinit
删除数据库和表
创建数据库!
数据库创建成功!
D:\test>flask test_1to1
开始测试
添加[email protected]成功!

你可能感兴趣的:(Flask-SQLAlchemy学习笔记(2):一对一关系)