一哮独、QuertSet的懶加載
每個(gè) QuerySet
都帶有緩存,這樣可以盡量減少數(shù)據(jù)庫(kù)訪問。理解它是如何工作的能讓你編寫更高效的代碼账蓉。
新創(chuàng)建的 QuerySet
緩存是空的。一旦要計(jì)算 QuerySet
的值逾一,就會(huì)執(zhí)行數(shù)據(jù)查詢铸本,隨后,Django 就會(huì)將查詢結(jié)果保存在 QuerySet
的緩存中遵堵,并返回這些顯式請(qǐng)求的緩存(例如箱玷, 對(duì)QuerySet
迭代)。后續(xù)針對(duì) QuerySet
的計(jì)算會(huì)復(fù)用緩存結(jié)果陌宿。
1.什么時(shí)候發(fā)起sql
請(qǐng)求锡足,并緩存數(shù)據(jù)
QuerySet
的結(jié)果集存儲(chǔ)在_result_cache
屬性中。我們可以查看_result_cache
來確定緩存了數(shù)據(jù)壳坪。
數(shù)據(jù)模型:
# models.py
class Student(models.Model):
username = models.CharField('學(xué)生姓名', max_length=16)
age = models.IntegerField('年齡')
def __str__(self):
return self.username
def __repr__(self):
return self.__str__()
>>> query_set = Student.objects.all()
>>> print(query_set._result_cache)
>>> None
直接打印緩存舶得,可以看的,緩存結(jié)果為 None
爽蝴,說明沒有緩存沐批,只有執(zhí)行計(jì)算
才會(huì)進(jìn)行緩存纫骑。
當(dāng)執(zhí)行以下計(jì)算
時(shí),django
會(huì)發(fā)送sql
請(qǐng)求珠插,并緩存數(shù)據(jù)惧磺。
-
len()
計(jì)算長(zhǎng)度 -
bool
判斷, 這里本質(zhì)上是調(diào)用len
判斷長(zhǎng)度是否大于0
迭代
-
打印
print
/repr
-
Pickling
序列化 -
轉(zhuǎn)化為list
->list(query_set)
我們一般用的最多的就是迭代
如下:
>>> from api.models import Student
>>> query_set = Student.objects.all()
當(dāng)我們生成query_set
時(shí)捻撑,查看pycharm
自帶的調(diào)試工具
截屏2020-05-0810.32.18.png
可以看出此時(shí)的
query_set
的_result_cache
為 None
備注:可以通過
query
屬性看出拼接出來的sql
語(yǔ)句:
SELECT "api_student"."id", "api_student"."username", "api_student"."age" FROM "api_student"
當(dāng)我們執(zhí)行
>>> list(query_set)
截屏2020-05-0810.37.09.png
可以看出query_set
的最新屬性變化磨隘,_result_cache
變成了一個(gè)list
序列,緩存這我們查詢出來的數(shù)據(jù)顾患。