成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章帶你了解Django ORM操作(高端篇)

開發 前端
本篇主要補充的是一些高端操作,例如聚合操作,分組操作,分組再篩選操作,F查詢和Q查詢。

[[373732]]

前言

上次兩篇基本學完的Django ORM各種操作,怎么查,各種查。感興趣的小伙伴可以戳這兩篇文章學習下,一篇文章帶你了解Django ORM操作(進階篇)、一篇文章帶你了解Django ORM操作(基礎篇)。

但是還是遺留了一些技能。,再來瞅瞅吧!

查詢

聚合操作

聚合操作,不要被名字嚇到了,通常用在篩選完一些數據之后,求一下平均值了,什么的。

例如:求所有書的總價格和平均價格

原生sql

  1. SELECT 
  2.     SUM(price) AS "所有書總價格"
  3.     avg(price) AS "所有書平均價格" 
  4. FROM 
  5. web_book; 

T SUM(price) AS "所有書總價格", avg(price) AS "所有書平均價格"FROMweb_book;

執行結果


ORM

  1. price = models.Book.objects.all().aggregate(Sum("price"),Avg("price"), ) 
  2. print(price) 

執行結果


可以發現和上面是一樣的,但是會發現列名是默認是字段__聚合函數名。

原生sql是可以指定顯示的列名的,同樣,ORM也可以。

代碼

  1. # 需要導入的包 
  2. from django.db.models import Avg,Sum 
  3.  
  4. price = models.Book.objects.all().aggregate(所有書總價格=Sum("price"), 所有書平均價格=Avg("price"), ) 
  5. print(price) 

執行結果


:price的類型直接就是dict,所以,在這是不能查看原生sql的。

但是上述ORM對應的原生SQL確實如上,所以那樣理解就行了。

分組操作

分組操作,就是將某一列,相同的值進行壓縮,然后就可以得出壓縮值的數量。

如果壓縮的是外鍵,還可以取出外鍵的詳細信息。

示例:查詢出每個出版社出版的數量。

通過研究表結構發現,每出版的書,都在book表中記錄,并且每本書會外鍵一個出版社id。


如果我們能對出版社id進行壓縮,然后再求出壓縮出版社id里面對應的數量。

嘖嘖,這不就出來了嗎?

代碼

  1. from django.db.models import Count 
  2.  
  3. ret = models.Book.objects.values("publish_id").annotate(publish_count=Count("publish_id")) 
  4. print(ret) 

執行結果


原生sql

  1. SELECT 
  2.     `web_book`.`publish_id`, 
  3.     COUNT(`web_book`.`publish_id`) AS `publish_count` 
  4. FROM 
  5.     `web_book` 
  6. GROUP BY 
  7.     `web_book`.`publish_id`; 

ORM分組和原生SQL對應圖

這一塊,我記得當初我迷茫了一段時間,主要是不知道如何和原生SQL對應上,根據多次測試經驗,對應圖如下。


分組獲取外鍵字段信息

上述確實可以通過分組實現了功能。

但是上述只能獲取出版社id,并不能獲取出版社名啥的,但是如何獲取壓縮外鍵字段詳細信息呢?

代碼

  1. ret = models.Book.objects.values("publish_id").annotate(publish_count=Count("publish_id")).values("publish__title","publish__phone","publish_count"
  2. print(ret) 

執行結果


:分組(annotate)后面跟的values。

里面只能寫外鍵字段的列和annotate里面的列,不能寫其他。

如果分組分的不是外鍵字段,那就不能再跟values!

分組再篩選

分組再篩選本質就是原生sql的group by .. having,將壓縮完的數據在進行條件判斷。

但是對壓縮的數據進行判斷只能通過having。

示例:查詢出版社出版的書大于2本的數據。

代碼

  1. ret = models.Book.objects.values("publish_id") \ 
  2.     .annotate(publish_count=Count("publish_id")) \ 
  3.     .filter(publish_count__gt=2) 
  4. print(ret) 

執行結果


F查詢

有時候,我們可能有這樣的需求,就是兩個列之間進行比較。

比如經典問題,一個商品,找到收藏數大于銷量的商品等之類的兩列進行比較的需求。

示例:查詢book表,評論數小于收藏數的數據。

代碼

  1. from django.db.models import F 
  2.  
  3. book = models.Book.objects.filter(comment_num__lt=F("collect_num")) 
  4. print(book) 

實際結果


執行結果


F對象還支持加減乘除后的比較

示例:評論數小于兩倍收藏數的數據。

代碼

可是*,也可以是-,+,÷

  1. from django.db.models import F 
  2.  
  3. book = models.Book.objects.filter(comment_num__lt=F("collect_num")*2) 
  4. print(book) 

執行結果


F對象還適用于更新

代碼

  1. models.Book.objects.all().update(price=F("price")+30) 

Q查詢

通常情況下,我們使用的filter(條件1,條件2,...),執行的都是and查詢。

但是通常一些時候,我們需要執行or查詢。

比如book表,查詢title=<<大明帝國>> or title=<<安史之亂>>的。

這時候,如果使用Django ORM,就只能使用Q查詢構建條件。

代碼

  1. from django.db.models import Q 
  2.  
  3. books = models.Book.objects.filter(Q(title="<<大明帝國>>") | Q(title="<<安史之亂>>")) 
  4. print(books) 

執行結果


:|是or的意思,&是and的意思。

所以,如果將上述的|換成&,filter(條件1,條件2,...)一個意思,還是and。

Q查詢之~

~相當于not。

示例:查詢title = "<<大明帝國>>" or title != "<<安史之亂>>"。

代碼

  1. from django.db.models import Q 
  2.  
  3. books = models.Book.objects.filter(Q(title="<<大明帝國>>") | ~Q(title="<<安史之亂>>")) 
  4. print(books) 

執行結果


Q查詢和and混合查詢

Q查詢和and查詢同時出現,Q查詢必須在其他查詢之前。

示例:查詢title = "<<大明帝國>>" or title != "<<安史之亂>>" 并且publish_id=1的。

代碼

  1. from django.db.models import Q 
  2.  
  3. books = models.Book.objects.filter(Q(title="<<大明帝國>>") | ~Q(title="<<安史之亂>>"),publish_id=1) 
  4. print(books) 

執行結果


動態構造Q查詢

一些時候,我們可能并不太確定有什么條件。

可能是動態傳的,傳過來多少,就拼接多少。

Q查詢,就能做到這個,在做動態Q查詢時,動態Q不僅支持or,還支持and。

示例:查詢publish_id=1或者title模糊=大明 的書。

代碼

  1. q = Q() 
  2. # 查詢方式,or還是and 
  3. q.connector = "or"  # or,and 
  4. # publish_id=1 
  5. q.children.append(("publish_id""1")) 
  6. # title__contains="大明" 
  7. q.children.append(("title__contains""大明")) 
  8.  
  9. books = models.Book.objects.filter(q) 
  10. print(books) 

執行結果


上面說了那么多,終于算是大概說完了,來簡單看一下怎么添加一條數據吧。

示例:添加一本書

代碼

方式一,通過objects.create。

這種方式用的最多。

  1. models.Book.objects.create
  2.     title="<<人類簡史2>>"
  3.     price=66.66, 
  4.     PublishDate="2020-01-02"
  5.     comment_num=23, 
  6.     collect_num=12, 
  7.     # 外鍵字段 django models對應的mysql 為 字段_id 
  8.     publish_id=1, 
  9.     # publish字段需要是一個 Publish 對象 
  10.     # publish=models.Publish.objects.filter(id=1) 

方式二,通過model對象.save()。

  1. book_obj = models.Book( 
  2.     title="<<人類簡史2>>"
  3.     price=66.66, 
  4.     PublishDate="2020-01-02"
  5.     comment_num=23, 
  6.     collect_num=12, 
  7.     # 外鍵字段 django models對應的mysql 為 字段_id 
  8.     publish_id=1, ) 
  9. book_obj.save() 

方式三,通過字典方式。

可能有的時候,我們正好將傳過來的參數構造成了一個字典,那就太好了,不需要再一個個取。

  1. c_dict = { 
  2.     "title":"<<tcp編程從入門到精通2>>"
  3.     "price":88.1, 
  4.     "PublishDate":"2020-01-03"
  5.     "comment_num":13, 
  6.     "collect_num":78, 
  7.     "publish_id":1, 
  8. models.Book.objects.create(**c_dict) 

更新

:update只能跟在在filter之后。

示例:將title="<<大明帝國>>"的數據修改為title="<<大明帝國666>>"。

代碼

  1. models.Book.objects.filter(title="<<大明帝國>>").update(title="<<大明帝國666>>"

filter可能篩選到的是多個值,一定要注意

刪除

delete只能跟在filter之后。

示例:刪除title=<<大明帝國666>>的數據。

  1. models.Book.objects.filter(title="<<大明帝國666>>").delete() 

總結

好了各位,到此為止,基本上,Django ORM操作基本完畢,至少80%的知識都覆蓋完畢。

本篇主要補充的是一些高端操作,例如聚合操作,分組操作,分組再篩選操作,F查詢和Q查詢。

如何動態構造Q查詢。

相對來說,Django還是自由度比價高的,而且寫起來確實比較省心。

用微笑告訴別人,今天的我比昨天強,今后也一樣。

 

責任編輯:姜華 來源: Python爬蟲與數據挖掘
相關推薦

2020-12-29 09:05:48

基礎DjangoORM

2021-01-01 09:20:20

操作DjangoORM

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

2021-01-12 09:04:12

Django FormForm組件開發

2023-09-06 14:57:46

JavaScript編程語言

2020-12-08 08:09:49

SVG圖標Web

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2021-06-24 09:05:08

JavaScript日期前端

2021-09-27 09:18:30

ListIterato接口方法

2021-01-26 23:46:32

JavaScript數據結構前端

2021-03-05 18:04:15

JavaScript循環代碼

2021-03-09 14:04:01

JavaScriptCookie數據

2024-04-19 14:23:52

SwitchJavaScript開發

2023-07-30 15:18:54

JavaScript屬性

2021-02-26 20:01:57

SVG濾鏡元素

2023-05-08 08:21:15

JavaNIO編程

2024-01-30 13:47:45

2020-11-10 10:48:10

JavaScript屬性對象

2021-06-04 09:56:01

JavaScript 前端switch
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品1区2区| 一级特黄a大片 | 久久噜 | 亚洲人成人一区二区在线观看 | 中文在线视频 | 日韩手机在线看片 | 成年人视频免费在线观看 | 亚洲成人在线免费 | 不卡一区二区三区四区 | 国产精品18久久久久久久 | 日韩一二三区 | 成人av电影天堂 | 中文字幕在线观看视频网站 | 亚洲 欧美 日韩在线 | 九九热在线观看视频 | 高清黄色| 亚洲男女视频在线观看 | 成人一区二区三区在线观看 | 日韩精品视频一区二区三区 | 日韩在线小视频 | 国产高清在线精品 | 天天操天天天干 | 亚洲视频三区 | 日韩欧美在线一区 | av在线免费网站 | 精品国产一区二区三区免费 | 久久成人一区 | 精品免费国产 | 亚洲一区二区三区免费观看 | 欧美a区| julia中文字幕久久一区二区 | 久久色视频| 亚洲在线日韩 | h在线 | 国产一区二区三区久久久久久久久 | 日韩高清中文字幕 | 久久最新| 成人一区二区视频 | 亚洲综合婷婷 | 午夜私人影院在线观看 | 亚洲成人精 |