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)