Flask 中文教程

第四部分:实战项目篇
第12章 入门级实战:个人博客系统
第13章 进阶级实战:RESTful API 服务
第五部分:部署运维与优化篇
第14章 Flask 应用部署
第15章 性能优化与安全加固
第六部分:问题解决与进阶篇
第16章 常见问题与解决方案
第17章 Flask 进阶与扩展

8.2 模型字段与关系

Flask模型字段与关系:核心字段、参数与元数据配置指南

Flask 中文教程

本教程详细讲解了Flask中使用SQLAlchemy的模型字段和关系,包括核心字段类型及其参数配置、一对一、一对多、多对多关系定义,以及模型元数据设置如表名、索引和排序,适合Flask初学者快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

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)

一对一关系表示一个模型实例关联另一个模型实例。例如,一个用户有一个个人资料。

定义方式:使用relationshipbackref

示例:

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应用的数据库模型。建议多加实践,结合官方文档深入学习。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包