ORM进阶:only、defer、selected_related
only与defer
需求1:只取某n列。
1、values得出列表嵌套字典
queryset=[ {},{}] models.User.objects.all().values( 'id','name')
2、values_list得出列表嵌套元组
queryset=[ (),()] models.User.objects.all().values_list( 'id','name')
3、only得出列表嵌套对象
queryset=[ obj,obj] result = models.User.objects.all().only('id','name','age')
# 通过for循环取值
for item in reuslt:
print(item.id,item.name,item.age)
4、defer排除某些字段
result = models.User.objects.all().defer('id','name','age')
selected_related —— 连表查询
需求2:打印所有用户姓名以及部门名称
现有两张表,用户与部门是多对一的关系
class depart: title = .... class User: name = ... dp = FK(depart)
方法1:
先查所有用户,再跨表查部门名称 —— 这样性能很低!
# select * from user result = models.User.objects.all() for item in result: print(item.name,item.dp.title) # 这样做跨表性能非常低
方法2:
使用selected_related进行连表查询
# select * from user left join depart on user.dp_id = depart.id result = models.User.objects.all().selected_related('dp') for item in result: print(item.name,item.dp.title )