Django first()和last() F查詢以及Q查詢


一、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對象查詢的后面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM