django查询-列延迟加载only()、defer()

发布时间 2023-07-18 09:19:26作者: 蕝戀

这玩意和sqlalchemy的几乎一样。

only():只加载给定的列,其他列只有在使用时会发起二次查询

defer():不加载指定的列,刚好和only()相反。

实例:

>>> ret = BookInfo.objects.get(id=1).only("name")
#1、先导入connection, 获取django查询的所有sql语句
>>> from django.db import connection

# 可以明显的看到,django只查询了name列的数据。
>>> connection.queries[-1]                    
{'sql': 'SELECT `bookinfo`.`id`, `bookinfo`.`name` FROM `bookinfo` LIMIT 21', 'time': '0.000'}
>>>

# 当我们使用其他列时,django会再次使用对象的主键来获取对应的值
>>> ret.is_delete 
False
>>> connection.queries[-1]
{'sql': 'SELECT `bookinfo`.`id`, `bookinfo`.`is_delete` FROM `bookinfo` WHERE `bookinfo`.`id` = 1 LIMIT 21', 'time': '0.000'}
>>>

特别注意,调用模型了的save()方法,只会保存加载过的列

>>> ret.readcount=888
>>> ret.save()
**# 可以看到,压根就没有更新readcount的值!!!!**
>>> connection.queries[-1] 
{'sql': "UPDATE `bookinfo` SET `name` = '射雕英雄传' WHERE `bookinfo`.`id` = 1", 'time': '0.016'}