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使用ajax上传文件的示例代码

    下面是关于“Python flask使用ajax上传文件的示例代码”的完整攻略,本攻略包含两条示例说明。 示例1:基于form表单上传文件的示例 步骤1:创建一个基于flask的web应用程序 使用Flask框架创建一个简单的web应用程序,示例代码如下: from flask import Flask, render_template, request a…

    Flask 2023年5月16日
    00
  • 深入flask之异步非堵塞实现代码示例

    以下是关于“深入flask之异步非堵塞实现代码示例”的完整攻略。该攻略包括两部分示例的说明:异步非堵塞实现的示例和使用gunicorn结合gevent的示例。 异步非堵塞实现示例 在Flask中,异步非堵塞实现可以通过使用Flask-SocketIO包中的socketio.run()方法。该方法基于gevent实现了异步非堵塞模型。 首先,需要安装Flask…

    Flask 2023年5月15日
    00
  • python编程Flask框架简单使用教程

    关于“Python编程Flask框架简单使用教程”的完整攻略,我可以提供以下内容: Python编程Flask框架简单使用教程攻略 什么是Flask框架 Flask是一个使用Python编写的Web应用程序框架,它可以轻松构建具有可扩展性的Web应用程序。 如何安装Flask框架 要安装Flask框架,只需要在终端输入以下命令即可: pip install …

    Flask 2023年5月15日
    00
  • Flask框架运用Axios库实现前后端交互详解

    这里是”Flask框架运用Axios库实现前后端交互详解”的完整攻略。 简介 在网页开发中,前后端分离已经成为了一种趋势。而实现前后端的交互则是非常重要的一部分。Axios库是一个基于Promise的HTTP客户端,可以用在浏览器和Node.js中。本文将详细介绍如何在Flask框架中运用Axios库实现前后端交互。 前提条件 在开始之前,需要确保以下条件满…

    Flask 2023年5月16日
    00
  • flask框架单元测试原理与用法实例分析

    Flask框架单元测试原理与用法实例分析 什么是单元测试 在软件开发中,单元测试指的是对软件中的最小可测试单元进行验证和检测的过程。最小可测试单元通常是一个函数或方法。它的目的是确保这个单元的行为符合预期并且它们在被改进之后不会破坏原有的功能。 单元测试通常是自动化的,意味着测试用例是在没有人工干预的情况下执行的。每个测试用例只测试一个特定的行为,并且不依赖…

    Flask 2023年5月15日
    00
  • Ajax与JSON的一些学习总结

    我来为你详细讲解“Ajax与JSON的一些学习总结”的攻略。 什么是Ajax? Ajax是Asynchronous JavaScript and XML的缩写,即异步的JavaScript和XML。它是一种利用JavaScript与后台进行数据交互的技术。 Ajax的原理 Ajax的核心在于XMLHttpRequest对象,通过它可以发送HTTP请求、接收H…

    Flask 2023年5月16日
    00
  • go-cqhttp智能聊天功能的实现

    让我一一为你详细讲解实现”go-cqhttp智能聊天功能”的完整攻略。 1. 安装Go环境和go-cqhttp插件 首先,我们需要在本地安装Go语言环境和go-cqhttp插件。具体安装步骤可以参考对应官方文档。 2. 搭建机器人服务 接着,我们需要在本地搭建机器人服务,让机器人能够和QQ进行通信。这部分可以通过在go-cqhttp插件的配置文件中设置相应参…

    Flask 2023年5月16日
    00
  • YOLOv5部署到web端详细过程(flask+js简单易懂)

    我将为您详细讲解“YOLOv5部署到web端详细过程(flask+js简单易懂)”的完整攻略。过程中将会包含两条示例说明。 YOLOv5部署到web端详细过程(flask+js简单易懂) 1. 简介 本教程将介绍如何将YOLOv5模型部署到web端,使用Flask作为后端框架和JavaScript作为前端框架,在网页上完成检测并展示结果。我们将提供两个示例:…

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