7.models之查詢

django.db.models.query.QuerySet
QuerySet的特點(diǎn):

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

查詢相關(guān)的API

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

多表聯(lián)合查詢

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

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

二:查詢《python實(shí)戰(zhàn)》這本書的作者姓名和出版社

Book.objects.filter(title="python實(shí)戰(zhàn)").values("authors__name", "publisher__name")

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

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

總結(jié):多表查詢的技巧

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

models之聚合查詢函數(shù)和分組查詢函數(shù)
在 django.db.models里 使用前需要先導(dǎo)入

  1. annotate(*args, **kwargs):可以為QuerySet中的每個(gè)對(duì)象添加注解??梢酝ㄟ^計(jì)算查詢結(jié)果中的每個(gè)對(duì)象所關(guān)聯(lián)的對(duì)象集合,從而得出總計(jì)值(也可以是平均值等),用于分組查詢,annotate前的vaules當(dāng)作分組條件
  2. aggregate(*args, **kwargs):通過對(duì)QuerySet進(jìn)行計(jì)算,返回一個(gè)聚合值的字典。aggregate()中的每個(gè)參數(shù)都指定一個(gè)包含在字典中的返回值,用于聚合查詢

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

當(dāng)業(yè)務(wù)背景很復(fù)雜的時(shí)候 orm并不能提供很好的支持這時(shí)候就可以使用原生的SQL

  • extra : 結(jié)果集修改器,一種提供額外查詢參數(shù)的機(jī)制
  • raw : 執(zhí)行原始的sql并返回模型實(shí)例
  • 直接執(zhí)行自定義SQL:這種方式完全不依賴model前面兩種方式還要依賴于model from django.db import connection
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容