079:【Django資料庫】QuerySet API詳解-filter、exclude、annotate
阿新 • • 發佈:2019-01-10
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")