关键词

Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍

下面给您详细讲解“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一对多与多对一与一对一及多对多关系介绍”的完整攻略。

本文链接:http://task.lmcjl.com/news/15537.html

展开阅读全文