2016-01-26 12 views
1

Django查詢集應該是懶惰的,但它會像下面那樣接縫。在objects.all()上進行過濾在Django中表現得不是很懶

我有以下(5秒)慢代碼(200,000記錄):
1. qs = MyCars.objects.all()
2.
3. qs = qs.filter(car_id__gt=0)

以下濾波是快:
A. qs = MyCars.objects.filter(car_id__gt=0)

我錯過了什麼? (因爲我必須包括第1行)。

使其更有趣。如果我第2行地址:
2. qs2 = qs
,然後在7號線:
7. qs2 = qs2.filter(car_id__gt=0)
然後是快。
所以,我想我會使用qs2來過濾第3行,但它很慢。

+1

他們應該都是瞬間的,因爲你沒有對'qs'做任何事情,所以他們沒有被評估。你是否顯示了所有的代碼? –

+0

我有大約8000行的代碼,但涉及的行都在上面說明了。我在每一行之間打印(' - '),並且看到保留的位置。 – Jon

+0

絕對有其他傷害表現的東西。一個明顯的驗證方法是django shell。如果你在django shell中運行你的查詢,我敢打賭他們會立即返回。 –

回答

0

好的,所以我在第2行寫了if qs:。我將它改爲if qs.count() > 0:。我沒有意識到我錯過了代碼的重要部分。

+0

我很高興你的問題現在已經修復。如果我的回答很有幫助,請將其標記爲已接受:) –

1

請確保您沒有執行here in the django docs提到的任何操作,因爲它們將導致查詢集被評估,並且它將對數據庫運行查詢。

如果您正在對查詢集進行評估,那麼如果此時的過濾器非常普遍且會導致大量數據加載,則需要更長的時間。

相關問題