1. 程式人生 > 實用技巧 >django的資料庫ORM進階操作

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