Flask-SQLAlchemy一对多 一对一 多对多关联

ops/2024/11/14 15:35:16/

一. 组织一个 Flask 项目通常需要遵循一定的结构,以便代码清晰、可维护。下面是一个典型的 Flask 项目结构:

python">my_flask_app/
│
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   ├── forms.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── index.html
│   └── static/
│       ├── css/
│       ├── js/
│       └── images/
│
├── migrations/
│
├── tests/
│   ├── __init__.py
│   ├── test_app.py
│
├── venv/
│
├── config.py
│
├── manage.py
│
├── requirements.txt
│
└── README.md

目录和文件说明

app/
  • __init__.py: 初始化 Flask 应用,注册蓝图和扩展。
  • models.py: 数据库模型定义。
  • views.py: 视图函数,处理路由和请求。
  • forms.py: 表单定义(如果使用 Flask-WTF)。
  • templates/: HTML 模板文件。
  • static/: 静态文件(CSS、JavaScript、图像等)。
migrations/
  • 数据库迁移文件夹,用于存储 Alembic 生成的迁移脚本。
tests/
  • 测试代码文件夹。
venv/
  • 虚拟环境文件夹。
config.py
  • 配置文件,存储应用配置变量。
manage.py
  • 管理脚本,用于启动应用和其他管理任务。
requirements.txt
  • 依赖文件,列出所有需要安装的 Python 包。
README.md
  • 项目说明文件,提供项目的基本信息和使用说明。

1. 在 Flask-SQLAlchemy 中,实现 一对多 和 一对一 还有多对多关联可以通过以下方式:

1.1 一对多关联

        假设有两个模型,Author(作者)和 Book(书籍),一个作者可以有多本书。

python">from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class Author(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String)# 定义与 Book 模型的一对多关系books = db.relationship('Book', backref='author')class Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String)author_id = db.Column(db.Integer, db.ForeignKey('author.id'))

在上述示例中,通过在 Author 模型中定义 books 属性,并在 Book 模型中定义 author_id 外键来建立一对多的关系。

2. 一对一关联

        假设 User(用户)和 Profile(用户资料)是一对一的关系。

python">class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String)# 定义与 Profile 模型的一对一关系profile = db.relationship('Profile', uselist=False, backref='user')class Profile(db.Model):id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('user.id'))bio = db.Column(db.String)

在上述示例中,通过在 User 模型中设置 relationship 的 uselist=False 来表示一对一关系。

在实际使用中,通过这些关联关系,可以方便地进行查询、添加、更新和删除等操作,例如获取某个作者的所有书籍,或者获取某个用户的资料等。

3. 多对多关联:

python">'''<--------------> 多对多模型 <-------------->'''
tags = db.Table('tags',db.Column('tag_id', Integer, db.ForeignKey('tag.id')),db.Column('page_id', Integer, db.ForeignKey('page.id')))class Page(db.Model):id = db.Column(db.Integer, primary_key=True)tags = db.relationship('Tag', secondary=tags,backref=db.backref('pages', lazy='dynamic'))class Tag(db.Model):id = db.Column(db.Integer, primary_key=True)


http://www.ppmy.cn/ops/113788.html

相关文章

vue无法通过页面路径访问提示404,通过nginx配置处理

部署vue项目时&#xff0c;可以通过IP的方式访问主页&#xff0c;当进入特定页面在刷新时&#xff0c;因为浏览器通过URL地址进行请求&#xff0c;就提示404错误。 每次都需要重新从主页进入&#xff0c;这里是因为nginx配置的问题&#xff0c;在nginx里增加一行重定向的设置 …

蓝桥杯-STM32G431RBT6(UART解析字符串sscanf和解决串口BUG)

一、C语言常识 printf和sprintf的主要区别在于它们的功能和用途&#xff1a; printf&#xff1a;主要用于将格式化的数据输出到标准输出&#xff08;如屏幕&#xff09;。sprintf&#xff1a;则是将格式化的数据存储到一个指定的字符串缓冲区中&#xff0c;而不是直接输出。 pr…

CentOS7更换阿里云yum更新源

目前CentOS内置的更新安装源经常报错无法更新&#xff0c;或者速度不够理想&#xff0c;这个时候更换国内的镜像源就是一个不错的选择。 备份内置更新源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里云repo源&#xff08;需要系统…

DockerDocker Compose安装(离线+在线)

Docker&Docker Compose安装(离线在线) Docker离线安装 下载想要安装的docker软件版本&#xff1a;https://download.docker.com/linux/static/stable/x86_64/ 如目标机无法从链接下载&#xff0c;可以在本机下载后 scp docker版本压缩包[如docker-20.10.9.tgz] usernameh…

一文彻底搞懂大模型 - Agent(智能体)

前 言 在当前信息时代&#xff0c;大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的发展速度和影响力日益显著。大模型强大的推理以及生成能力成为了搭建智能体的最好的组件。本内容来源于Datawhale的开源的“生成大模型基础&#xff08;so-larg…

把vue页面中展示的UI和图表导出为pdf或者图片

在 Vue 项目中&#xff0c;将页面中展示的 UI 和图表导出为 PDF 或图片可以使用以下几种方案&#xff0c;涉及一些专用的库和框架。下面是几种常见的方法&#xff1a; 1. html2canvas jsPDF 这是一种常见的组合&#xff0c;先将页面的 UI 转换为图片&#xff0c;然后导出为 …

Spring IDEA 2024 安装Lombok插件

1.简介 Lombook插件的Data标签可以自动生成类的get和set以及toString方法。 2.安装步骤 在idead设置的插件中搜索lombok插件&#xff0c;安装。 在Spring项目的pom.xml中添加依赖项 <dependency><groupId>org.projectlombok</groupId><artifactId…

C#开发记录如何建立虚拟串口,进行串口通信,以及通信模板

记录时间;2024年4月 记录如何开启虚拟串口以及进行基础串口通信。 建立虚拟串口 使用的软件是vspd&#xff0c;建立虚拟串口之后就可以将他们当成实际物理连接的两个串口进行通信。 之后使用我们之前给出的通信模板&#xff0c;建立一个稍微规矩一点的界面。 界面建立 其中…