這可能不是一個問題,因為它是一個確認和更多洞察力的請求。
在 python shell 中運行 QuerySet 請求時,如下所示:
qs = MyModel.objects.all()或qs = MyModel.objects.get_queryset()或qs = MyModel.objects.filter(field='something')
然后是這樣的任何東西:qs[0]或者,無論您使用什么索引,它都將始終在回傳的 QuerySet 的位置 0 中回傳 DB 條目qs[1]。qs[any_valid_int]這讓我一開始撓頭。現在我了解 QuerySets 是 Django (?) 中的生成器,并且被評估為惰性,如此處所述:Django Doc: Querysets Are Lazy
qs例如,當您執行任何評估回傳的操作(在 shell 中)len(qs)然后再次使用索引時,它會突然回傳正確的資料庫條目,其qs[any_valid_int]行為與預期完全相同。我相信這也與6 年前的這個Django 錯誤報告問題相對應。
那么假設這與惰性評估有關,我是否走在正確的軌道上?什么是Django shell 中最好/快速的方法來獲取一個 QuerySet 并直接索引你想要測驗的那個,而不必使用len(qs)第一個類似的東西?是否甚至可以使用這樣的直接索引,或者您是否已經遍歷它們/進一步過濾 QuerySet 等?謝謝
uj5u.com熱心網友回復:
那么假設這與惰性評估有關,我是否走在正確的軌道上?
是的。如果您有一個未評估的 queryset ,qs并且您使用 查詢,它將進行如下查詢:qs[i]
選擇 … 從 … 在哪里 … 限制 1 偏移量i
但是,如果您不指定 a ORDER BY …,那么資料庫可以按任何順序回傳記錄,因此第一個查詢中位置的專案0可以在第二個查詢中的位置 3,因此可能導致qs[0]并qs[1]回傳相同的專案。
但是,如果您使用len(qs),list(qs)或任何將資料加載到查詢集中的東西,則不會對qs[0]資料庫進行額外查詢:它已經在快取中擁有記錄,這意味著它將在特定位置回傳專案查詢集的快取,并且由于記錄已按特定順序回傳,無論該順序是什么,因此是資料庫回傳的不同記錄。qs[0]qs[1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442427.html
標籤:Python django 贝壳 django-queryset
下一篇:jq帶單引號bash腳本
