django的数据库ORM进阶操作
1、数据库查询的三种方式
正向查询:
(1)获取全部数据all
v1=models.UserInfo.objects.all().first() #取出Querryset类型数据,里面是对象,需循环取出
v1.ut #跨表,ut是外键
(2)只取部分字段value, 外键__字段
v2=models.UserInfo.objects.values("id","name","ut__title") #取出的是Querryset类型数据,里面是字典[{'id':1,"name':"运维"},{}]
for i in v2:
print(i["ut__title"])
(3)获取元组格式value_list, 外键__字段
v3=models.Business.objects.value_list("id","name","ut__title") #取出的是Querryset类型数据,里面是元组[(1,运维),(2,开发),]
for i in v3:
print(i["ut__title"])
反向查询:
(1)all(),使用 表名小写_set 进行反查
obj=models.UseType.objects.all().first()
obj.userinfo_set.all() #反查出所有,querry对象
(2)values反向查询, 小写的表名
obj=models.UseType.objects.values("id","title","userinfo")
obj=models.UseType.objects.values("id","title","userinfo__name")
(3)values_list反向查询, 小写的表名
obj=models.UseType.objects.values_list("id","title","userinfo")
obj=models.UseType.objects.values_list("id","title","userinfo__name")
2、知识点:查看你的代码所执行的sql语句:query
v=models.UserInfo.objects.values('ug_id')
print(v.query)
3、其他操作
(1)order_by:排序
从小到大:
user_list=models.UserInfo.objects.all().order_by("id")
从大到小:
user_list=models.UserInfo.objects.all().order_by("-id")
设置第二字段排序:
user_list=models.UserInfo.objects.all().order_by("-id","name")
(2)分组 annotate : 相当于 group_by和having
models.Host.objects.values("linkman").annotate(count=Count("id"))
#SELECT `cmdb_host`.`linkman_id`, COUNT(`cmdb_host`.`id`) AS `count` FROM `cmdb_host` GROUP BY `cmdb_host`.`linkman_id` ORDER BY NULL
models.Host.objects.values("linkman").annotate(count=Count("id")).filter(count__gt=2)
#SELECT `cmdb_host`.`linkman_id`, COUNT(`cmdb_host`.`id`) AS `count` FROM `cmdb_host` GROUP BY `cmdb_host`.`linkman_id` HAVING COUNT(`cmdb_host`.`id`) > 2 ORDER BY NULL
(3)filter/exclude:where条件
models.Host.objects.values("ip").filter(id="2")
#SELECT `cmdb_host`.`ip` FROM `cmdb_host` WHERE `cmdb_host`.`id` = 2
models.Host.objects.values("ip").exclude(id="2")
#SELECT `cmdb_host`.`ip` FROM `cmdb_host` WHERE NOT (`cmdb_host`.`id` = 2)
4、高级操作
(1)F:获取原字段原值进行更新操作
v=models.Host.objects.filter(id=2).update(linkman_id=F('linkman_id')-1)
#UPDATE `cmdb_host` SET `linkman_id`=`linkman_id`-1 WHERE id=2
(2)Q:用于构造复杂的查询条件,例如应用组合搜索
models.Host.objects.filter(Q(id__gt=10)&Q(id__lt=15))
#SELECT `cmdb_host`.`id`, `cmdb_host`.`device_modle`, `cmdb_host`.`use_status`, `cmdb_host`.`device_role`, `cmdb_host`.`ip`, `cmdb_host`.`root_password`, `cmdb_host`.`linkman_id` FROM `cmdb_host` WHERE (`cmdb_host`.`id` > 10 AND `cmdb_host`.`id` < 15)
(3)extra:更复杂的查询
(4)使用原生sql语句
指定使用其他数据库:
5、性能优化操作
(1)普通执行all():取得的结果是Querryset对象,但是在执行循环的时候需要连表时一次一次再做连表查询。
(2)select_related:在第一次查询的时候主动做连表,后面循环不需要再去做连表。适合数据比较少的情况
一次性查询:加select_related(外键)
(3)prefetch_related:也是在第一次查询的时候查出所有数据,但是形式不是连表,而是做两次单表查询。适合数据量大的情况