Django中的QuerySet
在Django中,objects 是 模型管理器(Model Manager) 的默认实例。它允许你通过模型类来查询数据库,执行常见的查询操作,比如获取、创建、更新和删除数据。
每个Django模型都会自动创建一个默认的模型管理器,名为 objects。你可以通过它来执行与该模型相关的各种数据库操作。
在Django中,QuerySet 是用于与数据库交互的一个对象列表。它表示从数据库中获取的一组数据,并支持对数据进行过滤、排序等操作。
1. 什么是QuerySet?
-
QuerySet 是Django模型的数据库查询结果集,它是延迟加载的,即只有在需要时才会真正执行数据库查询。
-
QuerySet 可以通过模型的管理器对象(例如
objects
)来生成。
2. 常用的QuerySet操作
(1) 获取所有对象
ModelName.objects.all()
返回模型的所有对象。
(2) 筛选数据 (filter)
用于根据条件筛选符合条件的对象。
ModelName.objects.filter(field_name=value)
比如:
# 获取所有年龄为18的用户
User.objects.filter(age=18)
(3) 排除数据 (exclude)
用于排除某些条件的数据。
ModelName.objects.exclude(field_name=value)
比如:
# 排除年龄为18的用户
User.objects.exclude(age=18)
(4) 获取单个对象 (get)
当确定只有一个结果时,可以使用 get 方法。否则会报错。
# 获取主键为1的用户
User.objects.get(pk=1)
(5) 排序 (order_by)
对查询结果进行排序
ModelName.objects.order_by('field_name')
比如:
# 按年龄升序排序
User.objects.order_by('age')
# 按年龄降序排序
User.objects.order_by('-age')
(6) 限制返回数量 ([:n])
可以像列表一样切片来限制结果集。
ModelName.objects.all()[:10] # 前10条数据
ModelName.objects.all()[5:10] # 第6到10条数据
(7) 聚合查询 (aggregate)
用于执行聚合操作,例如求和、平均值等。
from django.db.models import Avg, Sum
ModelName.objects.aggregate(Avg('field_name'), Sum('field_name'))
比如:
# 获取所有用户年龄的平均值和总和
User.objects.aggregate(Avg('age'), Sum('age'))
(8) 去重 (distinct)
返回唯一值的结果集。
ModelName.objects.distinct()
(9) 计数 (count)
获取查询结果的数量。
ModelName.objects.count()
3. QuerySet 的特性
1. 延迟加载 (Lazy Loading)
QuerySet 不会立即执行查询,只有当需要结果时才会执行。比如:
qs = User.objects.filter(age=18) # 不执行查询
users = list(qs) # 此时才会查询数据库
2. 链式查询
QuerySet 支持链式调用操作来构建复杂查询。
User.objects.filter(age__gte=18).exclude(is_active=False).order_by('-last_login')
3. 不可变性
一旦 QuerySet 执行查询,结果是不可更改的。如果需要新查询,需要重新构建 QuerySet。
4. 高级用法
(1) Q对象
用于实现更复杂的查询条件(如逻辑或、逻辑与)。
from django.db.models import Q
User.objects.filter(Q(age=18) | Q(is_active=True))
(2) F对象
用于比较同一个模型中两个字段的值。
from django.db.models import F
User.objects.filter(balance__gt=F('loan_amount'))
补充:
filter(balance__gt=F('loan_amount'))
-
balance__gt=F('loan_amount')
表示比较模型字段 balance 和 loan_amount 的值,筛选出满足条件balance > loan_amount
的记录。-
balance__gt
:表示 balance 大于某个值。 -
F('loan_amount')
:表示将字段 loan_amount 的值用作比较标准。
-
背后逻辑
Django ORM 将这段代码翻译成 SQL 查询:
SELECT * FROM user WHERE balance > loan_amount;
这会从数据库中返回所有 balance 大于 loan_amount 的用户。