8.2 模型字段与关系
Flask模型字段与关系:核心字段、参数与元数据配置指南
本教程详细讲解了Flask中使用SQLAlchemy的模型字段和关系,包括核心字段类型及其参数配置、一对一、一对多、多对多关系定义,以及模型元数据设置如表名、索引和排序,适合Flask初学者快速上手。
Flask模型字段与关系完整教程
简介
Flask是一个轻量级Web框架,常与SQLAlchemy等ORM(对象关系映射)工具结合使用来管理数据库。在本教程中,我们将重点介绍如何定义模型字段、配置关系以及设置元数据。假设您已安装Flask和Flask-SQLAlchemy扩展。
核心字段类型与参数配置
什么是模型字段?
模型字段定义了数据库中表的列,每个字段对应一个特定数据类型,并可以添加参数来约束数据行为。
核心字段类型
在SQLAlchemy中,常用的核心字段类型包括:
- Integer:用于存储整型数据,如
Integer。 - String:用于存储字符串,可指定长度,如
String(100)。 - Float:用于存储浮点数,如
Float。 - DateTime:用于存储日期和时间,如
DateTime。 - Boolean:用于存储布尔值,如
Boolean。 - Text:用于存储长文本,如
Text。
示例代码:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
age = db.Column(db.Integer)
email = db.Column(db.String(120), unique=True)
created_at = db.Column(db.DateTime, default=db.func.current_timestamp())
参数配置
每个字段都可以添加参数来定义其属性,常用参数包括:
- nullable:指定字段是否可为空,默认True(可为空),设为False表示必须填写。
- unique:指定字段值是否唯一,如设为True则不允许重复值。
- default:设置字段的默认值,可以是一个函数或静态值。
- primary_key:指定字段为主键,通常用于
id字段。 - index:为字段创建索引以提高查询效率。
- doc:为字段添加文档字符串,方便理解。
示例:
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False, unique=True)
price = db.Column(db.Float, default=0.0)
in_stock = db.Column(db.Boolean, default=True)
关系字段
关系字段用于定义模型之间的关联,SQLAlchemy支持一对一、一对多和多对多关系。
一对一关系(One-to-One)
一对一关系表示一个模型实例关联另一个模型实例。例如,一个用户有一个个人资料。
定义方式:使用relationship和backref。
示例:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
profile = db.relationship('Profile', backref='user', uselist=False)
class Profile(db.Model):
id = db.Column(db.Integer, primary_key=True)
bio = db.Column(db.Text)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
在User模型中,profile字段使用relationship指向Profile模型,uselist=False确保是一对一关系。
一对多关系(One-to-Many)
一对多关系表示一个模型实例关联多个其他模型实例。例如,一个用户有多个帖子。
定义方式:在“一”方使用relationship,在“多”方使用ForeignKey。
示例:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
posts = db.relationship('Post', backref='author', lazy=True)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
在User模型中,posts字段是关系,lazy=True表示延迟加载关联数据。
多对多关系(Many-to-Many)
多对多关系表示两个模型之间可以相互关联多个实例。例如,一个学生可以选择多个课程,一个课程可以被多个学生选择。
定义方式:使用关联表和relationship。
示例:
# 定义关联表
enrollment = db.Table('enrollment',
db.Column('student_id', db.Integer, db.ForeignKey('student.id')),
db.Column('course_id', db.Integer, db.ForeignKey('course.id'))
)
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
courses = db.relationship('Course', secondary=enrollment, backref='students')
class Course(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
在Student模型中,courses字段通过secondary=enrollment指定关联表。
模型元数据配置
元数据配置用于控制数据库表的创建和行为,如表名、索引和排序。
表名配置(Table Name)
默认情况下,SQLAlchemy会根据类名自动生成表名(转换为小写并加s)。您可以使用__tablename__属性自定义表名。
示例:
class Product(db.Model):
__tablename__ = 'products_table'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
索引配置(Indexes)
索引可以加快查询速度。您可以在__table_args__中定义索引。
示例:
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
email = db.Column(db.String(120))
__table_args__ = (
db.Index('idx_email', 'email'), # 为email字段创建索引
db.Index('idx_name_email', 'name', 'email'), # 复合索引
)
排序配置(Ordering)
排序通常在查询时指定,但也可以在模型中定义默认排序。使用__mapper_args__来设置。
示例:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100))
created_at = db.Column(db.DateTime, default=db.func.current_timestamp())
__mapper_args__ = {
'order_by': created_at.desc() # 默认按创建时间降序排列
}
在查询时,您还可以自定义排序,如Post.query.order_by(Post.title).all()。
总结
本教程详细介绍了Flask中模型字段和关系的核心概念。通过配置字段类型和参数,您可以定义数据库结构;通过关系字段,您可以建立一对一、一对多和多对多关联;通过元数据配置,您可以优化表名、索引和排序。掌握这些知识后,您能更好地设计和操作Flask应用的数据库模型。建议多加实践,结合官方文档深入学习。