当前位置: 首页 > article >正文

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

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

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(书籍),一个作者可以有多本书。

from flask_sqlalchemy import SQLAlchemy

db = 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(用户资料)是一对一的关系。

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. 多对多关联:

'''<--------------> 多对多模型 <-------------->'''
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.kler.cn/a/314559.html

相关文章:

  • PHP搭建开发环境(Windows系统)
  • vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局
  • 本地编译ChatNio的问题解决
  • 基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面
  • Qt 编写插件plugin,支持接口定义信号
  • 生成模型——PixelRNN与PixelCNN
  • GDPU Andriod移动应用 Activity
  • 【数据结构与算法】LeetCode:哈希表
  • Alinx MPSoC驱动开发第17章I2C实验修改设备树后petalinux编译报错
  • 分布式Id生成策略-美团Leaf
  • 使用python对图像批量水平变换和垂直变换
  • 深度学习参数管理
  • MySQL-DDL/DML(数据定义/操作语言)
  • GIS开发之如何使用OpenLayers,Leaflet,Mapbox,Cesium,ArcGIS, Turf.js 与 D3.js
  • 【Webpack--00802】配置Babel语法兼容
  • 【图像检索】基于Gabor特征的图像检索,matlab实现
  • Python面试宝典第50题:分割等和子集
  • Vscode、插件历史版本下载
  • [数据结构与算法·C++] 笔记 1.4 算法复杂性分析
  • [附源码]SpringBoot+VUE+Java实现人脸识别系统
  • 实战指南:深度剖析Servlet+JSP+JDBC技术栈下的用户CRUD操作
  • 探秘 Web Bluetooth API:连接蓝牙设备的新利器
  • 828华为云征文|Flexus X实例GitLab部署构建流水线-私人一体化代码仓库~
  • AWS账号可以共用吗?
  • vue 中互相不关联的两个组件怎么进行通信(数据传输)
  • MFC获取网页的html文本