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:也是在第一次查詢的時候查出所有資料,但是形式不是連表,而是做兩次單表查詢。適合資料量大的情況