2010-11-09 36 views
4

(我有一個Django 1.1.2和PostgreSQL的開發環境。) 我有兩個疑問:查詢限制和訂單不能在Django一起工作

tables = Table.objects.filter(is_active = True, 
           finishes_at__lt=datetime.datetime.now() 
          ).order_by("-starts_at", "weight")[:20] 

,另一種是

tables = Table.objects.filter(is_active = True, 
           finishes_at__lt=datetime.datetime.now() 
          ).order_by("-starts_at", "weight") 

這兩個查詢都是相同的,只是第一個查詢的末尾有[:20](LIMIT 20)。 但是當我運行這兩個查詢。我看到結果集有不同的順序。有沒有辦法糾正這個問題?

注意: 我在dbshel​​l中運行查詢,我看到實際上以不同順序給出結果的查詢。以下是查詢產生的Django

SELECT "table_table"."id" FROM "table_table" 
WHERE ("table_table"."is_active" = True 
     AND "table_table"."finishes_at" < '2010-11-09 11:57:48.482720') 
ORDER BY "table_table"."starts_at" DESC, "table_table"."weight" ASC 

,是其中一種限制是

SELECT "table_table"."id" FROM "table_table" 
WHERE ("table_table"."is_active" = True 
     AND "table_table"."finishes_at" < '2010-11-09 11:57:48.482720') 
ORDER BY "table_table"."starts_at" DESC, "table_table"."weight" ASC LIMIT 20 

回答

1

+1的細節,但它聽起來有點腥,我認爲你居然設法datetime.datetime.now()生產相同的值並捕獲SQL,因此請確認您確實傳遞了相同的值,並且上述SQL實際上已在日誌中捕獲。

就答案而言,我只能部分地解決它 - 從SQL的角度來看。 這兩個SQL在針對相同數據運行時會產生相同的順序。

你可以計數就可以了。

因此,假設SQL的確來自日誌,並且它們運行在相同的數據上,您可能會進一步操縱django端的事情,或者您的測試沒有做好。

+0

好的我發現了這個問題。如果表對象具有相同的starts_at和weight值,則結果集結果可能會按不同順序排列。例如在我的結果集中,我有20行,其中兩個具有相同的starts_at和weight值。在這種情況下,他們在不同的結果集中有不同的順序。爲了解決這個問題,我添加了命名屬性。現在他們有相同的順序。 – yilmazhuseyin 2010-11-09 13:03:36