目录
1. 什么是 Django ORM?
Django ORM(Object-Relational Mapping)是 Django 框架中的一部分,它允许你使用 Python 代码来操作数据库,而不需要编写 SQL 查询语句。Django ORM 会将数据库表映射为 Python 类,将表的每一行映射为类的实例,并允许你通过操作这些类的实例来进行数据库操作。
2. 创建和迁移模型
在 Django 中,数据库表是通过定义模型(models.py
)来创建的。模型是 Django ORM 与数据库交互的核心。
2.1 创建模型
首先,在应用的 models.py
文件中定义模型。例如,我们定义一个 Article
模型来表示文章:
# myapp/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100) # 文章标题
content = models.TextField() # 文章内容
published_date = models.DateTimeField(auto_now_add=True) # 发布日期
def __str__(self):
return self.title
在这个模型中,我们定义了 title
、content
和 published_date
字段,分别表示文章的标题、内容和发布日期。
2.2 迁移数据库
创建好模型后,使用以下命令生成并应用迁移文件,将模型同步到数据库:
python manage.py makemigrations
python manage.py migrate
第一个命令会生成数据库迁移文件,第二个命令会将迁移应用到数据库,创建相应的表。
3. Django ORM 查询基础
Django ORM 提供了强大的查询功能,你可以通过它来执行 SQL 查询的各类操作,包括插入数据、更新数据、删除数据以及数据查询。
3.1 获取所有对象
使用 Model.objects.all()
可以查询模型对应的数据库表中的所有记录。例如,查询所有文章:
from myapp.models import Article
articles = Article.objects.all()
for article in articles:
print(article.title)
这会返回所有 Article
表中的记录,并输出每篇文章的标题。
4. 单表实例的创建、读取、更新和删除 (CRUD)
Django ORM 的核心操作是对数据库的增删改查(CRUD)操作。我们将以 Article
模型为例,演示如何创建、读取、更新和删除数据库中的记录。
4.1 创建(Create)
要在数据库中插入新的记录,使用模型的构造函数或 create()
方法。例如,创建一篇新的文章:
# 使用构造函数创建实例
article = Article(title="Django ORM", content="Django ORM 是强大的数据库工具")
article.save() # 保存到数据库
# 使用 create() 方法
article = Article.objects.create(title="Django ORM", content="Django ORM 是强大的数据库工具")
这里,save()
会将模型实例的数据保存到数据库,而 create()
会创建并保存一条新记录。
4.2 读取(Read)
要从数据库中读取记录,可以使用 objects.all()
获取所有记录,或使用 objects.filter()
和 objects.get()
进行更具体的查询。
# 获取所有文章
articles = Article.objects.all()
# 根据条件过滤文章
article = Article.objects.filter(title="Django ORM")
# 获取符合条件的单个文章
article = Article.objects.get(id=1) # 根据 ID 获取单个文章
filter()
返回一个查询集,支持链式调用;get()
返回唯一的一条记录,如果没有找到或找到多条记录会引发异常。
4.3 更新(Update)
要更新已有的记录,首先获取该记录的实例,然后修改其字段值,最后调用 save()
方法保存修改。
article = Article.objects.get(id=1)
article.title = "更新后的标题"
article.save()
4.4 删除(Delete)
要删除记录,使用 delete()
方法。可以删除单个实例或多个实例。
# 删除单个记录
article = Article.objects.get(id=1)
article.delete()
# 删除符合条件的所有记录
Article.objects.filter(title="Django ORM").delete()
5. 使用查询集过滤数据
Django ORM 提供了强大的过滤功能,可以根据条件进行数据过滤、排序等操作。常见的过滤方法包括:
5.1 filter()
filter()
方法用于根据给定条件筛选记录。它返回一个查询集,可以使用链式调用进行多条件筛选。
# 获取标题为 'Django ORM' 的文章
articles = Article.objects.filter(title="Django ORM")
# 获取发布时间在某个时间段内的文章
from datetime import datetime
articles = Article.objects.filter(published_date__gte=datetime(2021, 1, 1))
5.2 exclude()
exclude()
方法用于排除满足某条件的记录。
# 排除标题为 'Django ORM' 的文章
articles = Article.objects.exclude(title="Django ORM")
5.3 order_by()
order_by()
方法用于对查询结果进行排序。可以使用 -
符号指定降序排序。
# 按发布时间降序排列
articles = Article.objects.all().order_by('-published_date')
5.4 distinct()
distinct()
方法用于去重结果。
# 去除重复的标题
articles = Article.objects.values('title').distinct()
6. 常见问题与解决方案
1. get()
返回多个对象
- 使用
get()
时,Django 假定查询条件唯一,如果查询结果返回多个对象,将抛出MultipleObjectsReturned
异常。此时,可以使用filter()
替代get()
,返回查询集。
2. 更新未保存实例
- 在修改实例数据后,必须调用
save()
方法来保存更改,否则数据不会写入数据库。
3. 查询性能问题
- 查询数据库时,尽量使用
filter()
代替all()
,避免加载大量无关数据。如果只需要某些字段,可以使用values()
或values_list()
来提高性能。
发表回复