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

一篇文章帶你了解Django ORM操作(進階篇)

開發 后端
上次咱們學習了一下Django ORM的基本查詢操作。查詢操作主要使用的是filter()方法。我們知道filter()查詢出來的是值,如果想取第一個值需要再filter().first()才行。

[[373193]]

回顧

上次咱們學習了一下Django ORM的基本查詢操作。

查詢操作主要使用的是filter()方法。

我們知道filter()查詢出來的是值,如果想取第一個值需要再filter().first()才行。

還知道了get()和filter().first()的區別等等。

Django ORM的查詢還有很多,繼續來看叭!!!

查詢操作

對象.外鍵字段

比如,我們拿到了一個書的信息,我們可以這樣打印他的信息。

代碼

  1. book = models.Book.objects.filter(title="<<大明帝國>>").first() 
  2. print(f"book類型:{type(book)}"
  3. print(f"id:{book.id}"
  4. print(f"書名:{book.title}"
  5. print(f"價格:{book.price}"
  6. print(f"書名:{book.PublishDate}"
  7. print(f"出版社:{book.publish}") # 外鍵字段 

執行結果

 

注:藍色為外鍵字段

不知道你有沒有疑問,為什么book.publish會把郵電出版社打印出來。

這個原因主要在于外鍵對象的__str__方法。

 

就是因為我Publish返回的是self.title,所以才能打印出來郵電出版社,如果我想打印出版社聯系方式咋辦?

代碼

  1. print(f"出版社類型:{type(book.publish)}")  # <class 'web.models.Publish'
  2. # book.publish已經是models.Publish對象,所以可以自由調里面的屬性 
  3. print(f"出版社電話:{book.publish.phone},"

執行結果

 

總結

對象.外鍵字段拿到的就是外鍵字段對象,直接就可以通過對象.外鍵字段.外鍵屬性獲取具體值。

反向查詢(表名__set.all())

上述我們是通過正向查詢的方式查詢到了書對應的出版社具體信息。

但是如果說,我們拿到的就是一個出版社名呢?

通常情況下,你可能會這樣!

代碼

  1. # 查詢郵電出版社 
  2. publish_obj = models.Publish.objects.filter(title="郵電出版社").first() 
  3. # 獲取出版社id 
  4. publish_id = publish_obj.id 
  5. # 查詢publish_id為出版社id的 
  6. book_list = models.Book.objects.filter(publish_id=publish_id) 
  7. print(book_list) 

執行結果

 

其實,還有一種方法:通過一個對象,反向查多個對象。

代碼

  1. publish_obj = models.Publish.objects.filter(title="郵電出版社").first() 
  2. book_list = publish_obj.book_set.all() 
  3. print(book_list) 

執行結果

 

雙下劃線跨表查詢

還是上述這個問題,通過一個出版社名,查找屬于這個出版社的圖書。

基于雙下劃線的跨表查詢,理論是更簡單的!

 

注:可以看到還有__contains等其他filter條件查詢,通過__跨表依然是可以通用的。

代碼

  1. book_list = models.Book.objects.filter(publish__title="郵電出版社"
  2. print(book_list) 

執行結果

 

連續跨表

__不僅可以進行跨一張表,還能跨多張表。

以圖書Many作者表為例,根據出版社查詢圖書和作者多對多的信息。

代碼

  1. ret = models.BookManyAuthor.objects.filter(book__publish__title="郵電出版社"
  2. print(ret) 

跨了book表又跨了publish表

 

執行結果

 

values

有時候,我們可能只需要一些特定的列,這時候使用values即可。

代碼

  1. # 語法 
  2. book_list = models.Book.objects.all().values("列1","列2",...) 
  3. # 示例 
  4. book_list = models.Book.objects.all().values("title","price"
  5. print(book_list) 

代碼

 

values返回的值有點像列表套字典,但是其實本質還是QuerySet類型。

values_list

values_list和values功能一樣,都是取相關的列,但是返回的類型格式不一樣。

代碼

  1. book_list = models.Book.objects.all().values_list("title","price"
  2. print(book_list) 

執行結果

 

這個有點像列表套元組,但是其實本質還是QuerySet。

related_name

related_name通常用于反向查詢時,替換<表名>_set。

原方式

models.py

 

代碼

  1. # 查詢郵電出版社 
  2. publish = models.Publish.objects.filter(title="郵電出版社").first() 
  3. print(publish) 
  4. # 反向一對多 
  5. book_list = publish.book_set.all() 
  6. print(book_list) 

執行結果

 

別名方式

models.py

 

代碼

  1. # 查詢郵電出版社 
  2. publish = models.Publish.objects.filter(title="郵電出版社").first() 
  3. print(publish) 
  4. # 反向一對多 
  5. book_list = publish.book_list.all() 
  6. print(book_list) 

執行結果

 

filter().filter()...

上文我們說過,是支持多個filter的,filter(<條件>).filter(<條件>)...

這種情況通常用于不確定篩選條件,但是多層篩選的情況下。

代碼

  1. # 舉例而已,后面filter里面可以是其他 或 的條件 
  2. book1 = models.Book.objects.filter(title="<<大明帝國>>").filter(price="99"
  3. # 效果同上 
  4. book2 = models.Book.objects.filter(title="<<大明帝國>>",price="99"
  5. print(book1) 
  6. print(book2) 

執行結果

 

總結

本篇主要還是上篇的繼續補充,還是關于filter的查詢部分。

本次主要有外鍵字段類型,反向查詢默認使用<表名>__set,還可以使用related_name反向字段查詢。

雙下劃線可以進行條件查詢,還可以進行跨表查詢,還可以連續跨表,values和values_list區別。

多個filter進行條件篩選。

如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。

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

本文轉載自微信公眾號「Python爬蟲與數據挖掘」,可以通過以下二維碼關注。轉載本文請聯系Python爬蟲與數據挖掘公眾號。

 

責任編輯:武曉燕 來源: Python爬蟲與數據挖掘
相關推薦

2021-01-05 09:07:30

Django ORMF查詢Q查詢

2020-12-29 09:05:48

基礎DjangoORM

2021-01-12 09:04:12

Django FormForm組件開發

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺

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技術棧公眾號

主站蜘蛛池模板: 自拍视频网 | 99免费精品 | 日韩精品成人 | 日本一区二区不卡 | 日韩伦理一区二区 | 日韩av三区 | 久久精品一区二区 | 91在线免费观看网站 | 国产视频一区二区三区四区五区 | 国产精品久久久久久久久久久久久 | 羞羞在线观看视频 | 很很干很很日 | www.97zyz.com| 久久精品av | 噜啊噜在线 | japanhd成人 | 在线午夜电影 | 91在线精品一区二区 | 日韩h| 国产精品综合色区在线观看 | 国产在线观 | 国产二区三区 | 国外成人免费视频 | 婷婷一级片| 亚洲国产高清免费 | 日韩aⅴ在线观看 | 欧美性成人 | 成人h动漫精品一区二区器材 | 精品欧美一区二区在线观看视频 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | av在线成人 | 狠狠婷婷综合久久久久久妖精 | 少妇诱惑av | 91精品www| 成人av电影天堂 | 一区二区欧美在线 | 中文二区 | 色婷婷亚洲国产女人的天堂 | 精品久久久久久久久久久院品网 | 夜夜摸夜夜操 | 国产乱码高清区二区三区在线 |