您好,登錄后才能下訂單哦!
這篇文章主要講解了django如何利用Q對象與F對象進行查詢,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
Q對象:
優勢:可以實現 與|或|非 組合查詢。
給幾個小例子就一目了然了:
Book.objects.filter(id__gt=2,bread__gt=20) #and關系
Book.objects.filter(Q(bread__gt=20) & Q(id__gt=2)) #and關系
Book.objects.filter(Q(bread__gt=20) | Q(id__gt=2)) #or關系
Book.objects.filter.(~Q(id=3)) # ~表示not,查詢編號不等于3的圖書
F對象:
優勢:能利用當前obj的值進行比較。
Book.objects.filter(bread__gt=F('bcomment')*2) #閱讀量大于評論量的圖書*2,可以在F對象上使用算術運算
以前你可能經常只進行Book.objects.filter(bread__gt=20)這樣的查詢 ,有了F對象你就可以和當前obj的屬性值進行比較了。
實際開發中遇到的問題:
如果事情都按照示例那樣進行就好了,然而開發中總會遇到一些坑。
比如下面這個是我實際開發中遇到的問題:
user = request.user
Interviewer.object.filter(Q(interviewer_1=user) | Q(interviewer_2=user) | Q(interviewer_3=user))
目的是想查一面或者二面或者三面的面試官包含user的面試。
其中interviewer_1、interviewer_2、interviewer_3是Interviewer表中的三個多對多字段的外鍵。
結果可能讓意想不到,結果是一個包含多個重復值的查詢集,置于為什么會重復,我并沒用做深入調查,但是這在django ORM多表查詢中會經常遇到,這就是網上說的一般的情況下,QuerySet 中不會出來重復的,重復是很罕見的,但是當跨越多張表進行檢索后,結果并到一起,可能會出來重復的值。
那么要怎么解決這個問題呢?很簡單,后面加個.distinct()作用就是去重。
user = request.user
Interviewer.object.filter(Q(interviewer_1=user) | Q(interviewer_2=user) | Q(interviewer_3=user)).distinct()
補充知識:Django中models利用ORM對Mysql進行查表的語句
一: all() 返回模型類對應表格中所有的數據。
二:get():返回表格中滿足條件的一條數據,如果查到多條數據,則拋異常:MultipleObjectsReturned,查詢不到數據,則拋異常:DoesNotExist。
三:filter():參數寫查詢條件,返回滿足條件 QuerySet 集合數據。
條件格式:
“模型類屬性名” __條件名=值(此處模型類屬性名為model里面的屬性名,不是數據庫里面表的字段名)
1)判斷是否存在
BookInfo.object.filter(id__exact=1)此處的__exact 可以省略
2)模糊查詢
>查詢書名包含傳的圖書
BookInfo.objects.filter(btitle__contains='傳')
>查詢書名不為空的圖書
BookInfo.objects.filter(btitle__isnull=False)
>查詢圖書id在1,3,5的圖書
BookInfo.objects.filter(id__in=[1,3,5])
>比較查詢 gt lt(less than) gte(equal) lte
BookInfo.objects.filter(id__gte=3)
>日期查詢
BookInfo.objects.filter(bpub_date__year = 1980)
BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))
四、exclude()返回不滿足條件的數據
BookInfo.objects.exclude(id=3)
五 F對象
作用:用于類屬性之間的比較條件。
用法:
1:導入 from django.db.models import F
2 :舉例 BookInfo.objects.filter(bread_gt = F('bcomment') (查詢閱讀量大于評論量的圖書)
3: 舉例 BookInfo.objects.filter(bread__gt=F(‘bcomment')*2) (查詢閱讀量等于2倍評論量的圖書)
六 Q對象
作用:用于查詢時的邏輯條件。可以對 Q 對象進行&|~操作。
用法:
1:導入 from django.db.models import Q
2: 舉例:
BookInfo.objects.filter(id__gt=3,bread__gt=30) 和 Book.objects.filter(Q(id__gt=3)&Q(bread__gt=3))
3:舉例:
BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))
七 order_by 返回QuerySet
作用:對查詢結果進行排序。
1:舉例 BookInfo.object.all().order_by("id")[正序]
2:舉例 BookInfo.object.all().order_by("-id")[倒序]
3:舉例:BookInfo.objects.filter(id__gt=3).order_by('-bread')
看完上述內容,是不是對django如何利用Q對象與F對象進行查詢有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。