7.models之查詢

django.db.models.query.QuerySet
QuerySet的特點:

  1. 是可迭代的
  2. 可切片

查詢相關的API

  • get(**kwargs):返回與所給的篩選條件相匹配的對象,返回的結果有且只有一個,如果符合條件的對象超過一個會拋出app名.models.MultipleObjectsReturned異常,如果沒有找到符合條件的查詢會拋出 app名.models.DoesNotExist異常---model對象
  • all():會查詢所有結果---QuerySet對象
  • filter(**kwargs):它包含那些與所給篩選條件匹配的對象---QuerySet對象
  • exclude(**kwargs):它包含那些與所給篩選條件不匹配的對象---QuerySet對象
  • order_by(*fields):對查詢的結果排序(在查詢的字段前加-號可按結果的反向排序)
  • reverse():對查詢的結果再進行反排序
  • disinct():對查詢的結果去重
  • values(*fields):返回一個VaulesQuerySet--一個特殊的QuerySet,運行后得到的并不是一系列model的實例化對象,而是一個可迭代的字典序列
  • values_list(*fields):它與vaules()結果相似,不過后者返回的是字典序列,而vaules_list返回的結果是元祖序列
  • count():返回數據庫中匹配查詢(QuerySet)的對象數量
  • first():返回第一條數據等價于[0]
  • last():返回最后一條數據等價于[-1]
  • exists():是否存在數據(True|False)
  • 更多api在model層的 查詢結果集(QuerySet)中的QuerySet method reference(查詢結果集api參考)里面

多表聯合查詢

一:查詢id為1的作者的所有信息

#一般用這種方式獲取信息,但是不利于獲取信息
AuthorDetail.objects.filter(id=1)
# 這種方式可以很好的打印出所有信息,但是作者返回的是id不友好,應該返回姓名比較好
AuthorDetail.objects.filter(id=1).values("id", "sex", "email", "address", "birthday", "author")
# 有主外的可以通過兩個下劃線接要查詢的字段來查詢
AuthorDetail.objects.filter(id=1).values("id", "sex", "email", "address", "birthday", "author__name")

二:查詢《python實戰》這本書的作者姓名和出版社

Book.objects.filter(title="python實戰").values("authors__name", "publisher__name")

三:查詢jack寫過的書,及書籍的出版社信息

Book.objects.filter(authors__name="jack").values("title", "publisher__name")

總結:多表查詢的技巧

  • __ : 兩個下劃線可以生成連接查詢(內連接外聯接都可以 這里還不懂 ),查詢關聯的字段信息
  • _set : 提供了對象訪問相關表數據的方法。但是這種方法只能是相關類訪問定義了關系的類(主鍵類訪問外鍵類)
書籍類中有一個字段publisher就是引用的出版社類的主鍵,雖然出版社類中并沒有定義書籍有關的信息但是我們還是可以通過_set方法查詢到出版社出版的圖書----此方法只適用于model對象不適用與QuerySet對象
Publisher.objects.get(name="中國出版社").book_set.all().values("title")

models之聚合查詢函數和分組查詢函數
在 django.db.models里 使用前需要先導入

  1. annotate(*args, **kwargs):可以為QuerySet中的每個對象添加注解。可以通過計算查詢結果中的每個對象所關聯的對象集合,從而得出總計值(也可以是平均值等),用于分組查詢,annotate前的vaules當作分組條件
  2. aggregate(*args, **kwargs):通過對QuerySet進行計算,返回一個聚合值的字典。aggregate()中的每個參數都指定一個包含在字典中的返回值,用于聚合查詢

----------使用原生的sql

當業務背景很復雜的時候 orm并不能提供很好的支持這時候就可以使用原生的SQL

  • extra : 結果集修改器,一種提供額外查詢參數的機制
  • raw : 執行原始的sql并返回模型實例
  • 直接執行自定義SQL:這種方式完全不依賴model前面兩種方式還要依賴于model from django.db import connection
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容