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

yizhihongxing

下面给您详细讲解“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后端的模型详解

    “微信小程序前端如何调用python后端的模型”需要通过Web API的方式进行调用。下面是详细的步骤: 步骤1:设计后端Web API 后端Web API实现了模型的调用,并输出模型结果。可以使用Flask或Django等框架来实现Web API。以下是一个用Flask编写的Web API的示例代码: from flask import Flask, re…

    Flask 2023年5月16日
    00
  • Python 工具类实现大文件断点续传功能详解

    Python 工具类实现大文件断点续传功能详解 简介 在文件上传或下载过程中,如果遇到大文件,如果发生传输失败,需要重新传输的情况会非常不方便,甚至无法实现。为了解决这种问题,我们可以实现大文件断点续传功能,使文件上传或下载可以随时中断和恢复。 实现流程 大文件断点续传的实现流程如下: 设置支持 range 的Range头,支持服务器返回指定范围的数据。 获…

    Flask 2023年5月16日
    00
  • Python的Flask框架中集成CKeditor富文本编辑器的教程

    下面我来详细讲解如何在Python的Flask框架中集成CKeditor富文本编辑器。 步骤一:安装Flask和CKEditor库 首先确保已经安装了Flask和CKEditor库。如果没有安装,可以使用以下命令进行安装: pip install flask-ckeditor 步骤二:配置Flask应用 在Flask应用的配置文件中,添加以下代码段: fro…

    Flask 2023年5月16日
    00
  • Linux中使用top命令的技巧

    下面是“Linux中使用top命令的技巧”的完整攻略。 一、什么是top命令 top命令是一款常用的系统监控工具,可以实时查看系统的资源占用情况,包括进程占用的CPU、内存等。 二、top命令的参数和用法 top命令的常用参数如下: -d:指定刷新时间,默认为3秒; -p:指定监控的进程PID; -u:指定监控的用户; -H:显示进程的线程; -i:不显示I…

    Flask 2023年5月15日
    00
  • Python Web框架Flask中使用百度云存储BCS实例

    下面就为大家详细讲解在Python Web框架Flask中使用百度云存储BCS实例的完整攻略。具体步骤如下: 1. 安装Flask和BCS SDK 在使用Flask和BCS SDK之前,需要先安装它们。可以使用pip在命令行中进行安装。 命令行中输入: pip install flask pip install bcs-python-sdk 2. 配置BCS…

    Flask 2023年5月16日
    00
  • python文件路径操作方法总结

    基于”python文件路径操作方法总结”这个主题,我会给出完整的攻略,包括以下几个部分的讲解: 什么是文件路径? Python中的文件路径表示方式 文件路径的操作方式(包括绝对路径和相对路径) 示例说明 1. 什么是文件路径? 文件路径是标识文件在计算机上存储位置的一串字符,一般包括文件所在驱动器、目录、文件名和文件扩展名等内容。 在Windows上,文件路…

    Flask 2023年5月16日
    00
  • 详解vue-admin和后端(flask)分离结合的例子

    下面我将为您详细讲解如何使用flask和vue-admin进行前后端分离,并给出两个示例说明。 背景 前端开发中,随着前端框架的不断推陈出新,后端的开发出现了一种趋势,就是将前端和后端进行分离。 准备工作 在使用flask和vue-admin分离前,有几个准备工作: 安装flask 安装vue-cli 安装vue-admin 具体安装方法这里不再赘述,可以在…

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

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

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