1. 程式人生 > >079:【Django資料庫】QuerySet API詳解-filter、exclude、annotate

079:【Django資料庫】QuerySet API詳解-filter、exclude、annotate

QuerySet API詳解-filter、exclude、annotate:

在使用 QuerySet 進行查詢操作的時候,可以提供多種操作。比如過濾完後還要根據某個欄位進行排序,那麼這一系列的操作我們可以通過一個非常流暢的 鏈式呼叫 的方式進行。比如要從文章表中獲取標題為 123 ,並且提取後要將結果根據釋出的時間進行排序,那麼可以使用以下方式來完成:

articles = Article.objects.filter(title='123').order_by('create_time')

可以看到 order_by 方法是直接在 filter 執行後呼叫的。這說明 filter 返回的物件是一個擁有 order_by 方法的物件。而這個物件正是一個新的 QuerySet 物件。因此可以使用 order_by 方
法。那麼以下將介紹在那些會返回新的 QuerySet 物件的方法。

1. filter :將滿足條件的資料提取出來,返回一個新的 QuerySet 。具體的 filter 可以提供什麼條件查詢。請見查詢操作章節。
2. exclude :排除滿足條件的資料,返回一個新的 QuerySet 。示例程式碼如下:

Article.objects.exclude(title__contains='hello')

以上程式碼的意思是提取那些標題不包含 hello 的圖書。

3. annotate :給 QuerySet 中的每個物件都新增一個使用查詢表示式(聚合函式、F表示式、Q表示式、Func表示式等)的新欄位。示例程式碼如下:

articles = Article.objects.annotate(author_name=F("
author__name"))

例項程式碼如下:

def index(request):
    # books = Book.objects.filter(id__gte=2).filter(~Q(id=3))    #這兩句相等的
    # books = Book.objects.filter(id__gte=2).exclude(id=3)
    books = Book.objects.annotate(author_name=F("author__name"))
    for item in books:
        print(item.id, item.author.name)
     #
print(item.id, item.author__name) # 減少對資料的查詢
print(books.query) return HttpResponse("success")