django.db.models.query.QuerySet
QuerySet的特點(diǎn):
- 是可迭代的
- 可切片
查詢相關(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)入
- annotate(*args, **kwargs):可以為QuerySet中的每個(gè)對(duì)象添加注解??梢酝ㄟ^計(jì)算查詢結(jié)果中的每個(gè)對(duì)象所關(guān)聯(lián)的對(duì)象集合,從而得出總計(jì)值(也可以是平均值等),用于分組查詢,annotate前的vaules當(dāng)作分組條件
- 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