在 Django5 中,ORM(对象关系映射)系统是它的核心功能之一。通过 Django 的 ORM,开发者无需直接编写 SQL 语句,就可以通过 Python 类和对象来操作数据库。Django 提供了一个简洁的 API 来定义数据模型、执行数据库迁移、进行查询操作和处理复杂的关系型数据。
本章将详细介绍 Django5 的 ORM 系统,模型的定义,数据库迁移的使用,以及多种数据库操作的实现。
6.1 Django5的ORM系统概述
Django5 的 ORM 允许开发者以面向对象的方式与数据库进行交互。每个 Django 模型类对应数据库中的一张表,模型类的属性则对应数据库表中的字段。ORM 会自动将模型类映射到数据库表,并且支持 CRUD(增、删、改、查)操作。
6.1.1 ORM基础概念
- 模型类(Model):代表数据库中的一个表。
- 查询集(QuerySet):代表一组从数据库中查询到的对象,支持链式调用,提供了丰富的查询功能。
- 数据库迁移(Migration):Django 通过迁移管理数据库的结构变更,确保模型和数据库表结构的一致性。
6.2 模型定义
Django 的模型是通过继承 django.db.models.Model 类来定义的。每个模型类的属性代表数据库表中的字段,Django 会根据模型自动生成数据库迁移文件并同步到数据库。
6.2.1 定义基本模型
下面是一个简单的模型定义示例,表示一个博客文章模型。
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title- CharField:用于定义字符字段,通常用于存储短文本(如标题、名称等)。
- TextField:用于存储长文本内容,适用于文章、描述等。
- DateTimeField:用于存储日期和时间,auto_now_add=True 表示对象创建时自动填充当前时间,auto_now=True 表示每次保存时都会自动更新时间。
6.2.2 字段选项
Django 提供了多种字段类型和选项,以满足不同的数据需求。以下是常用字段类型及其选项:
- IntegerField:用于存储整数。
- BooleanField:用于存储布尔值(True 或 False)。
- EmailField:用于存储电子邮件地址,自动验证邮箱格式。
- ImageField:用于存储图像,支持文件上传。
class User(models.Model):
username = models.CharField(max_length=100, unique=True)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)6.3 数据库迁移
Django 通过迁移来管理数据库结构的变更。迁移文件是记录模型更改(如添加字段、修改字段类型等)的脚本,它允许开发者在开发过程中轻松地应用和回滚数据库变更。
6.3.1 创建迁移文件
每当你对模型进行更改时,都需要生成一个迁移文件。使用 makemigrations 命令来创建迁移文件:
python manage.py makemigrations
该命令会根据模型的更改生成迁移文件,通常位于 migrations 目录下。迁移文件名会以数字和描述性名称命名,如 0001_initial.py。
6.3.2 应用迁移
生成迁移文件后,使用 migrate 命令将更改应用到数据库:
python manage.py migrate
这会将所有待处理的迁移文件应用到数据库,并保持数据库与模型同步。
6.3.3 查看迁移历史
使用 showmigrations 命令可以查看迁移文件的状态和历史:
python manage.py showmigrations
6.3.4 反向迁移
如果你想撤销某个迁移,可以使用 migrate 命令指定一个特定的迁移版本来回滚:
python manage.py migrate app_name 0001
这将回滚到指定的迁移文件。
6.4 数据库操作
Django 提供了丰富的数据库操作 API,可以通过模型进行增、查、改、删等操作。
6.4.1 创建数据(Create)
可以使用模型类的 create() 方法来直接创建并保存一个对象。
# 创建并保存一个新的文章
post = Post.objects.create(
title="Django ORM",
content="Django ORM is very powerful for database operations.",
)或者通过实例化模型对象并使用 save() 方法保存数据:
post = Post(title="Another Post", content="This is another example.")
post.save() # 保存到数据库
6.4.2 查询数据(Read)
Django 的查询集 API 提供了强大的查询功能,可以进行过滤、排序、分页等操作。
6.4.2.1 获取所有数据
# 获取所有文章
posts = Post.objects.all()
6.4.2.2 按条件过滤数据
# 获取标题为 'Django ORM' 的文章
post = Post.objects.filter(title="Django ORM")
6.4.2.3 获取单个对象
# 获取特定 ID 的文章
post = Post.objects.get(id=1)
注意: get() 方法会抛出 DoesNotExist 异常,如果没有找到匹配的对象。
6.4.2.4 排序数据
# 按创建时间倒序排序
posts = Post.objects.all().order_by('-created_at')
6.4.2.5 限制查询结果
# 获取前 5 条文章
posts = Post.objects.all()[:5]
6.4.3 更新数据(Update)
Django 提供了 update() 方法来批量更新数据。如果只想更新单个对象,可以先查询并修改对象,然后保存。
# 更新文章内容
post = Post.objects.get(id=1)
post.content = "Updated content"
post.save() # 保存更新
# 使用 update() 批量更新
Post.objects.filter(id=1).update(content="Updated content")6.4.4 删除数据(Delete)
可以使用 delete() 方法删除对象。注意,delete() 是一个方法,必须先查询对象再调用它。
# 删除单个文章
post = Post.objects.get(id=1)
post.delete()
# 批量删除
Post.objects.filter(id__gt=5).delete()6.4.5 聚合操作
Django 的 ORM 还支持聚合操作,如计算总和、平均值、最大值等。
from django.db.models import Count, Max, Avg
# 统计文章数量
article_count = Post.objects.aggregate(Count('id'))
# 获取最新的创建时间
latest_post = Post.objects.aggregate(Max('created_at'))
# 获取文章内容的平均长度
average_length = Post.objects.aggregate(Avg('content'))6.5 关系型数据操作
Django 支持一对一、一对多和多对多等关系型数据模型。通过在模型中使用外键(ForeignKey)、一对一字段(OneToOneField)和多对多字段(ManyToManyField)来建立不同的关系。
6.5.1 一对多关系(ForeignKey)
例如,假设每篇文章都属于某个作者,文章和作者之间是“一对多”的关系。我们可以在 Post 模型中使用 ForeignKey 来表示这个关系。
class Author(models.Model):
name = models.CharField(max_length=100)
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(Author, on_delete=models.CASCADE)在这个示例中,每篇文章都有一个与之关联的作者,ForeignKey 创建了一个指向 Author 模型的外键关系。
6.5.2 多对多关系(ManyToManyField)
多对多关系通常用于表示两个模型之间的多对多的关系。比如,文章和标签之间的关系就是多对多关系。
class Tag(models.Model):
name = models.CharField(max_length=50)
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
tags = models.ManyToManyField(Tag)在这个示例中,Post 和 Tag 模型之间存在多对多关系,使用 ManyToManyField 来定义该关系。
小结
本章介绍了 Django5 中的 ORM 系统,包括模型的定义、数据库迁移的使用以及常见的数据库操作。Django 的 ORM 简化了数据库操作,开发者可以使用 Python 类和对象来进行数据库的增、删、改、查操作,而无需直接编写 SQL 语句。
Django 的模型系统支持各种关系型数据库操作,如一对一关系、一对多关系和多对多关系,这使得 Django 成为开发数据库驱动的应用程序的理想框架。通过数据库迁移功能,Django 可以轻松地管理数据库的结构变化,保证数据库与模型的一致性。
















