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 )

 

posted on 2019-09-23 11:00  江湖乄夜雨  阅读(313)  评论(0编辑  收藏  举报