a 需求
一般我们都是这样表的某几列
models.User.objects.all().values("id","name")
quertset = [{},{}]
或者
models.User.objects.all().values_list("id","name")
quertset = [(),()]
现在我们可以用
models.User.objects.all().only("id","name")
quertset = [obj,obj]
取得都是对象,对象里存储着你所需的字段
通过遍历获取
如果你遍历的对象属性不在only里,它会自动从数据库里查询
比如遍历的属性有age,而age不在only里,它会自动从数据库里查询
models.User.objects.all().defer("id","name")
排除id,name
b 需求
查询所有的用户姓名和部门名称
class depart:
title = ....
class User:
name = .....
dp = FK(depart)
一般我们可能会这样操作
result = models.User.objects.all()
for item in result:
print(item.name,item.dp.title)
这样操作性能低
这样做的sql语句为 select * from user先查询用户表,然后通过item.dp.title再做一次查询,如果遍历十次就需要查询depart表十次.
总共十一次.
result = models.User.objects.all().selected__related("dp")主动创建关联关系,
相当于select * from user left join depart on user.dp_id = depart.id,主动做连表
用在一对一,一对多
for item in result:
print(item.name,item.dp.title)
查询次数为一次
缺点:如果连表越多性能越差
prefetch_related:两次单表查询
#select * from user
#通过python代码获取所有的dp_id = [1,2]
#select * from depart where id in de_id
result = models.User.objects.all().prefetch_related("dp")
for item in result:
print(item.name,item.dp.title)
支持多对多
数据冗余:
外键的作用是节省硬盘资源
如果数据量比较大可以不设置外键,提高查询速度,单表查询比连表查询速度快,用空间换时间