一、all()命令分析
1、user_list = models.UserInfo.objects.all() #查询表一次可以得到该表的所有信息
注释:user_list.query可以查询到原生sql语句
2、存在问题
for row in user_list:
row中只去取当前表数据,如果需要取外键对应的表中的数据(连表查询),那么取多少次就查询多少次,大大降低了查询效率
3、解决办法
1、方法1:values方法
user_list = models.UserInfo.objects.values(....) #可以通过values的方式连表查询一次性取出所需要的内容(只去取当前表数据和FK表关联字段)
2、方法2:select_related主动连表方法
user_list = models.UserInfo.objects.all().select_related('FK字段')
#user_list = models.UserInfo.objects.all().select_related('FK字段1','FK字段2','FK字段3') #对多个外键字段主动连表查询
#user_list = models.UserInfo.objects.all().select_related('FK字段__关联表字段') #只能对一对一,一对多表使用不能对多对多表使用
for row in user_list:
row中只去取当前表数据和FK表关联字段
3、方法3:由于连表降低性能所以通过 prefetch_related方法不主动连表
user_list = models.UserInfo.objects.all().prefetch_related('FK字段1','FK字段2','FK字段3')
4:补充:
1、only只取某个字段
# user_list = models.UserInfo.objects.all().only('name')
2、defer排除当前字段
# user_list = models.UserInfo.objects.all().defer('name')