一、first()和last()
分別返回queryset的第一項與最后一項,具體用法如下:
p = Blog.objects.order_by('title').first()
等同於:
try: p = Blog.objects.order_by('title')[0] except IndexError: p = None
舉個栗子:
現在博客表中只有一篇博客,該博客id為13:
然后在shell命令行中,找id大於13的第一篇博客,我們知道是沒有的,使用first()時得到一個None對象,如果使用[0]會觸發IndexError
所以first()和last()很適合博客里的上一篇下一篇這種場景。如果是最后一篇博客找下一篇博客時,或者第一篇博客找上一篇博客時不會報錯,返回一個None對象,如果是中間的博客,id為13的博客的下一篇是id大於13的第一篇博客,也就是id為14的博客,如果id為14的博客被刪了,就是id為15的博客,一直往后找,如果一直沒有,則返回一個None對象,不管怎么樣,不會觸發IndexError。
# 取出ID大於當前博客ID的數據的第一個 -> 當前文章的下一篇 next_topic = Topic.objects.filter(id__gt=author_topic.id, author=author).first() # 取出ID小於當前博客ID的數據的最后一個 -> 當前文章的上一篇 last_topic = Topic.objects.filter(id__lt=author_topic.id, author=author).last()
二、F查詢以及Q查詢
當一般的查詢語句已經無法滿足我們的需求時,Django為我們提供了F和Q復雜查詢語句。假設場景一:老板說對數據庫中所有的商品,在原價格的基礎上漲價10元,你該怎么做?場景二:我要查詢一個名字叫xxx,年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎么寫你的ORM語句
1.F查詢
from django.db.models import F from app01.models import Book Book.objects.update(price=F("price")+20) # 對於book表中每本書的價格都在原價格的基礎上增加20元
就這樣一條簡單的語句就完成了對表中所有商品價格的更新,是不是很方便!如果沒有F查詢,你首先要獲取原價格,再做一個算術運算,然后更新字段。F查詢專門對對象中某列值的操作,不可使用__雙下划線!
2.Q查詢
Q查詢可以組合使用 “&”, “|” 操作符,當一個操作符是用於兩個Q的對象,它產生一個新的Q對象,Q對象可以用 “~” 操作符放在前面表示否定,也可允許否定與不否定形式的組合。Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面。
from django.db.models import Q print(Book.objects.filter(Q(id=3))[0]) # 因為獲取的結果是一個QuerySet,所以使用下標的方式獲取結果 print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0]) # 查詢id=3或者標題是“Go”的書 print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J"))) # 查詢價格大於等於70並且標題是“J”開頭的書 print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3))) # 查詢標題是“J”開頭並且id不是3的書 print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26")) # Q對象可以與關鍵字參數查詢一起使用,必須把普通關鍵字查詢放到Q對象查詢的后面