这玩意和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'}
标签:defer,connection,bookinfo,only,django,id,加载
From: https://www.cnblogs.com/juelian/p/17561869.html