2016-11-15 92 views
5

我正在手動創建一個Django查詢集,並且只想使用Django ORM來讀取生成的querset.query SQL本身,而不會觸擊我的數據庫。如何判斷Django QuerySet是否已被評估?

我知道Django的quersets懶惰,我看到所有的觸發查詢集被評估的OPS:

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

但是......如果我只是想驗證我的代碼是純粹建立查詢集膽量,但不是評估和打我的數據庫卻無意中?我可以使用查詢集對象上的任何屬性來驗證它沒有經過評估而沒有實際評估它?

+0

我不這麼認爲,我想沒有這樣的用例需要。爲什麼你需要這樣的功能? –

+0

我對Django ORM創建的SQL有其他用處,而不是立即對它進行實際評估。 – slumtrimpet

回答

5

對於使用select返回模型實例的清單,如基本過濾器或排除查詢集,該_result_cache屬性爲None,如果查詢集並沒有進行評估,或結果的列表,如果它有。有關非公開屬性的常見警告適用。

對於其他查詢集(計數,刪除等),我不知道有一個簡單的方法。也許看你的數據庫日誌,或DEBUG模式下運行,並檢查connection.queries如下所述: https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

+0

非常完美,非常感謝。 – slumtrimpet

+0

@slumtrimpet - 更新以反映適用於使用'SELECT' SQL檢索記錄的查詢,但不一定適用於所有查詢的查詢。 –

1

對於那些想知道誰QuerySet s的評價:這是當他們迭代切片酸洗緩存再版()'d,LEN()倒是,列表()「ED或布爾()'ed。 請參閱https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

+2

這是OP在問題中提供的鏈接。問題不在於「Django何時評估查詢集」,問題是「給定查詢集對象,我如何判斷它是否已經被評估」。查看源代碼,觀察'_result_cache'在這些操作過程中的變化:https://github.com/django/django/blob/master/django/db/models/query.py –

+0

@PeterDeGlopper哦,是的,我很喜歡對不起,你完全正確。我將編輯答案,以便對想要知道Django何時對其進行評估的人員提供信息。 – feakuru

相關問題