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一对多与多对一与一对一及多对多关系介绍”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask sqlalchemy一对多与多对一与一对一及多对多关系介绍 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Python编程在flask中模拟进行Restful的CRUD操作

    下面我详细讲解一下“Python编程在flask中模拟进行Restful的CRUD操作”的攻略及两个示例。 入门 首先,需要安装好 Python 和 Flask。你可以在官方文档中找到相应的安装指南: Python 安装指南 Flask 安装指南 安装好之后,我们就可以开始了。 搭建项目 首先,创建一个包含 Flask 和相应依赖项的虚拟环境。可以使用 ve…

    Flask 2023年5月15日
    00
  • Flask中sqlalchemy模块的实例用法

    接下来我为您详细介绍Flask中sqlalchemy模块的实例用法的完整攻略。 1. 安装和配置 首先需要安装Flask和sqlalchemy模块,可以使用pip命令来进行安装。 pip install Flask pip install sqlalchemy 安装完成后,首先需要在Flask应用程序中导入sqlalchemy模块: from flask_s…

    Flask 2023年5月15日
    00
  • 如何使用flask将模型部署为服务

    下面是使用Flask将模型部署为服务的完整攻略。 1. 准备工作 在使用Flask将模型部署为服务之前,我们需要完成以下准备工作: 安装Flask:可以使用pip install Flask命令进行安装。 准备模型:将训练好的模型保存为.h5或.pb格式文件,并将其导出为TensorFlow Saved Model。 2. 创建Flask应用 首先,我们需要…

    Flask 2023年5月16日
    00
  • flask重启后端口被占用的问题解决(非kill)

    下面我将详细讲解如何解决“flask重启后端口被占用”的问题。 问题描述 在使用 Flask 开发 web 应用时,有时会出现在重启应用程序后端口被占用的问题,导致无法正常运行应用程序。 解决方法 方法一:更改应用程序端口 更改应用程序端口是最直接的解决方法。可以通过修改 Flask 应用程序的 config 文件,将端口号改为其他未被占用的端口。 示例如下…

    Flask 2023年5月16日
    00
  • 分享15个最受欢迎的Python开源框架

    下面我将详细讲解分享15个最受欢迎的Python开源框架的完整攻略。 步骤一:了解Python开源框架的概念和作用 Python开源框架是指由Python编写的可重用代码库,它具有一定程度的抽象能力和模板代码,并且可以为特定任务或问题提供解决方案。Python开源框架可以使程序员更加高效地开发应用程序、网站和手动/自动脚本,同时也可以减少重复琐碎的工作。 步…

    Flask 2023年5月15日
    00
  • Flask 请求钩子的实现

    在Flask应用程序中,请求钩子是一种机制,它允许您在请求到达您的视图函数之前或之后执行一些操作。这对于需要在请求到达或离开视图函数时进行一些特殊处理的情况非常有用。 Flask提供了四个请求钩子,分别是before_request、before_first_request、after_request和teardown_request。 before_req…

    Flask 2023年5月15日
    00
  • python中的信号通信 blinker的使用小结

    标题:Python中的信号通信 blinker的使用小结 什么是blinker? blinker 是一个简单的 Python 库,作用是用于处理事件的发布和订阅。它提供了一个 Signal 类型,用于将函数连接到一个事件源上,并在该事件源发布事件时自动触发对应的函数。 安装blinker 首先需要安装 blinker 库,在命令行中使用 pip 命令进行安装…

    Flask 2023年5月16日
    00
  • flask框架路由常用定义方式总结

    让我为你详细讲解一下“flask框架路由常用定义方式总结”的完整攻略。 什么是flask框架? Flask是一个基于 Python 语言的轻量级 Web 开发框架,使用 Werkzeug 作为 Web 服务器网关接口,使用 Jinja2 模板引擎,这两个库也都是 Flask 标配。它设计精简,易于扩展,使它成为很多 Web 开发者喜欢使用的框架之一。 什么是…

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部