下面给您详细讲解“Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍”的完整攻略。
一对多关系
一对多关系适用于一个模型拥有多个其他模型的实例,但是其他模型的实例只属于一个模型实例。比如一个用户可以拥有多篇文章,但是一篇文章只属于一个用户。
在 Flask sqlalchemy 中可以使用 relationship 属性来建立一对多关系,例如:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
articles = db.relationship('Article', backref='author', lazy='dynamic')
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64))
content = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
上述代码中 User 模型的 articles 属性通过 relationship 属性与 Article 模型建立了一对多关系,而 Article 模型的 author_id 列则通过 ForeignKey 属性指定了外键关系。
多对一关系
多对一关系与一对多关系相反,一个模型的实例属于另一个模型的实例。比如多篇文章属于一个用户,但是一篇文章只属于一个用户。
在 Flask sqlalchemy 中也可以使用 relationship 和 ForeignKey 属性来建立多对一关系:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64))
content = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author = db.relationship('User', backref='articles')
上述代码中 Article 模型的 author 属性通过 relationship 属性与 User 模型建立了多对一关系,而 Article 模型的 author_id 则通过 ForeignKey 属性指定了外键关系。
一对一关系
一对一关系适用于一个模型实例只拥有一个其他模型实例,而另一个模型实例也只属于一个模型实例。比如一个用户只有一个头像,一个头像也只属于一个用户。
在 Flask sqlalchemy 中可以使用 uselist=False 属性来建立一对一关系:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
avatar_id = db.Column(db.Integer, db.ForeignKey('avatar.id'))
avatar = db.relationship('Avatar', backref='user', uselist=False)
class Avatar(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(128))
上述代码中 User 模型的 avatar 属性通过 relationship 属性与 Avatar 模型建立了一对一关系,而 User 模型的 avatar_id 则通过 ForeignKey 属性指定了外键关系。
多对多关系
多对多关系适用于多个模型实例之间相互关联,每个模型实例可能属于多个其他模型实例。比如一个用户可以订阅多个标签,一种标签也可以被多个用户订阅。
在 Flask sqlalchemy 中可以使用 secondary 属性来建立多对多关系:
subscriptions = db.Table('subscriptions',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
tags = db.relationship('Tag', secondary=subscriptions,
backref=db.backref('users', lazy='dynamic'))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
上述代码中 User 模型的 tags 属性通过 relationship 和 secondary 属性与 Tag 模型建立了多对多关系。
示例说明
一对多关系示例
假设我们有一个博客系统,需要存储用户和文章的数据。先创建一个 User 和 Article 模型,并建立一对多关系:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
articles = db.relationship('Article', backref='author', lazy='dynamic')
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(64))
content = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
接下来可以通过下面这些代码往数据库中添加用户和文章数据:
# 创建两个用户
john = User(name='John')
susan = User(name='Susan')
# 添加到会话中,以便提交到数据库
db.session.add(john)
db.session.add(susan)
# 提交到数据库
db.session.commit()
# 创建两篇文章,指定所属的用户
article1 = Article(title='First post', content='Hello, World!', author=john)
article2 = Article(title='Second post', content='Goodbye, World!', author=susan)
# 添加到会话中,以便提交到数据库
db.session.add_all([article1, article2])
# 提交到数据库
db.session.commit()
多对多关系示例
假设我们有一个社交媒体应用程序,需要存储用户和标签的数据,并建立多对多关系。先创建一个 User 和 Tag 模型,并建立多对多关系:
subscriptions = db.Table('subscriptions',
db.Column('user_id', db.Integer, db.ForeignKey('user.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
tags = db.relationship('Tag', secondary=subscriptions,
backref=db.backref('users', lazy=True))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
接下来可以通过下面这些代码往数据库中添加用户和标签数据:
# 创建三个用户
john = User(name='John')
susan = User(name='Susan')
lisa = User(name='Lisa')
# 创建两个标签
python = Tag(name='Python')
flask = Tag(name='Flask')
# 添加到会话中,以便提交到数据库
db.session.add_all([john, susan, lisa, python, flask])
# 提交到数据库
db.session.commit()
# 订阅 Python 标签的用户
john.tags.append(python)
susan.tags.append(python)
lisa.tags.append(python)
# 订阅 Flask 标签的用户
susan.tags.append(flask)
lisa.tags.append(flask)
# 添加到会话中,以便提交到数据库
db.session.add_all([john, susan, lisa])
# 提交到数据库
db.session.commit()
以上就是“Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍 - Python技术站