django.db.models.query.QuerySet
QuerySet的特點:
- 是可迭代的
- 可切片
查詢相關的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里 使用前需要先導入
- annotate(*args, **kwargs):可以為QuerySet中的每個對象添加注解。可以通過計算查詢結果中的每個對象所關聯的對象集合,從而得出總計值(也可以是平均值等),用于分組查詢,annotate前的vaules當作分組條件
- aggregate(*args, **kwargs):通過對QuerySet進行計算,返回一個聚合值的字典。aggregate()中的每個參數都指定一個包含在字典中的返回值,用于聚合查詢
----------使用原生的sql
當業務背景很復雜的時候 orm并不能提供很好的支持這時候就可以使用原生的SQL
- extra : 結果集修改器,一種提供額外查詢參數的機制
- raw : 執行原始的sql并返回模型實例
- 直接執行自定義SQL:這種方式完全不依賴model前面兩種方式還要依賴于model from django.db import connection