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 的用户。

posted @ 2024-11-21 19:00  hisun9  阅读(7)  评论(0编辑  收藏  举报