我閱讀了 Querysets Django 檔案關于查詢集是懶惰的,但在這里仍然有點困惑。
所以在我看來,我將查詢集設定為這樣的變數
players = Players.objects.filter(team=team)
稍后,我有一個可以應用的排序機制
sort = '-player_last_name'
if pts > 20:
players = players.filter(pts__gte = pts).order_by(sort)
else:
players = players.filter(pts__lte = pts).order_by(sort)
if ast < 5:
players = players.filter(asts__lte = ast).order_by(sort)
else:
players = players.filter(asts__gte = ast).order_by(sort)
context = {players: players)
return render(request, '2021-2022/allstars.html', context)
我想知道的是,玩家查詢集何時評估?是在呈現每個頁面時,還是每次將查詢集分配給變數時?因為如果是前者,那么我就可以只應用 .order_by(sort) 鏈,之前的應用是多余的。
uj5u.com熱心網友回復:
QuerySet如果您“使用”查詢集,則會評估 s 。您可以通過列舉過吧,呼叫消耗的queryset .get(…), .exists(…),.aggregate(…)或者 .count(…),檢查感實性(例如用if myqueryset:或bool(queryset),或撥打len(…)了它,等等。作為一個經驗法則,它被評估,如果你在它使得結果執行操作不再是QuerySet.
如果您列舉它,或者你打電話len(…),結果被快取QuerySet,所以稱它是第二次,或者列舉了它在呼叫后len(…)會不會再拍訪問資料庫。
在這種特定情況下,QuerySet在呼叫render(…)函式之前不會評估任何s 。例如{% if players %},如果在模板中使用, or {% for players %}, {{ players|length }}, or {{ players.exists }},那么它將評估查詢集。
uj5u.com熱心網友回復:
Django 查詢被設計為“懶惰的”——也就是說。他們不會運行資料庫查詢,直到有東西請求實際資料。可以通過添加過濾和其他類似功能來修改查詢。
例如,以下代碼TeamMember在搜索字串為 時請求所有物件'all',否則添加過濾器以將名稱限制為與給定搜索匹配的名稱。
squad_list = TeamMember.objects(state__in={"Hired", "Joined", "Staff", "Recruiting"})
if squadname != 'all':
squad_list = squad_list(squad__icontains=squadname.lower())
當squadlist查詢最終執行時,它將檢索所需的記錄。這有幫助嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/361112.html
