2010-09-19 45 views
0

如果我只是獲取用戶列表,並且我無意更新此列表,是否可以選擇將查詢標記爲「只讀」?有沒有辦法通過只讀django的ORM來使選擇更快?

原因是,我知道大多數ORM都會對返回的行進行某種更改跟蹤。所以如果我事先知道我不需要更新任何東西,我很好奇,如果我能告訴ORM將結果集標記爲只讀。

回答

2

如果我剛開的用戶列表,我也沒有更新此名單的意圖,我是否標誌着查詢的選項爲「只讀」不知何故?

AFAIK有沒有辦法做到這一點。我想知道是否有人認爲/不知道。

原因是,我知道大部分ORM都會對返回的行進行某種更改跟蹤。所以如果我事先知道我不需要更新任何東西,我很好奇,如果我能告訴ORM將結果集標記爲只讀。

請問這個要求的原因是什麼?這對我來說感覺就像是過早的優化。如果你做一些剖析找到某個特定查詢的性能差認爲它可以通過將查詢集只讀,然後這個問題進場改善。不太可能,恕我直言。

1

您可以堅持查詢集,只要評估它不必再次進行查詢。你甚至可以附加這個請求。

例子:

# in the view, a decorator, or middleware 
request._my_users = Users.objects.all() 
request._my_users[:] 

# Later reference request._my_users 
+0

隨着OP的要求,您的建議更改如何使結果集爲「只讀」? – 2010-09-19 06:06:26

0

ORM不需要跟蹤獲取的行,而是通過主鍵來確定行是否插入或更新(如果您沒有使用save()設置force_insert或force_update)。

誰能讀到這樣的位置:http://docs.djangoproject.com/en/1.2/ref/models/instances/#how-django-knows-to-update-vs-insert

這就是說,它是沒有必要的,甚至是不可能使用一個模型「只讀」,因爲它不會產生任何性能改進。

如果你想優化,然而有一些步驟可以嘗試(但只是小的改進,所以你可能不應該優化,直到它真的有必要)。

例如,請致電querySet.exists() resp。 querySet.count()而不是(bool)querySet resp。 len(querySet) if(並且只有)如果你以後沒有從查詢集中讀取數據。否則,不要使用exists()/ count(),因爲它會產生一個額外的查詢,而在後一個緩存中,實際讀取的查詢集是免費的,因爲它已經被緩存了。

另一種方法是使用only()和defer()將SELECT限制爲您實際需要的字段,如果您知道需要它們,則使用select_related()預取外鍵關係。如果你有更多的關係和列的模型,這可以給你一個顯着的性能提升。

相關問題