对django的QuerySets(查询集)的理解

本文介绍Django中查询集的懒加载机制及其切片操作,演示如何通过惰性执行提高效率,并展示如何限制查询集记录数目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询集 是惰性执行的 —— 创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集 需要求值时,Django 才会真正运行这个查询。看下这个例子:
>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
虽然它看上去有三次数据库访问,但事实上只有在最后一行(print(q))时才访问一次数据库。一般来说,只有在“请求”查询集 的结果时才会到数据库中去获取它们。当你确实需要结果时,查询集 通过访问数据库来求值。 关于求值发生的准确时间,参见何时计算查询集。

可以使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。
例如,下面的语句返回前面5 个对象(LIMIT 5):
>>> Entry.objects.all()[:5]
下面这条语句返回第6 至第10 个对象(OFFSET 5 LIMIT 5):
>>> Entry.objects.all()[5:10]
不支持负的索引(例如Entry.objects.all()[-1])。
通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询。有一个例外,是如果你使用Python 切片语法中"step"参数。例如,下面的语句将返回前10 个对象中每隔2个对象,它将真实执行查询:
>>> Entry.objects.all()[:10:2]


用 PyCharm debug 查看 logs2 和 logs3 的 SQL 语句是一样的。LIMIT 8 OFFSET 2
    logs1 = LogInfo.objects.all()
    logs2 = logs1[2:10]
    logs3 = LogInfo.objects.all()[2:10]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值