2015-03-08 42 views
0

我有一個模型,它有一個名稱字段。它的定義如下按字母順序排序不起作用

name = models.CharField(db_index=True, max_length=150, unique=True) 

然後,當我檢索模型時,我想按字母順序對結果進行排序。爲了得到第25,我做到以下幾點:

Company.objects.order_by("name").defer("bic")[:25] 

這導致一個有趣的順序:

  1. 鱷梨戶外有限公司
  2. 杏計算機
  3. 香蕉公司
  4. 蘋果電腦有限公司

這是爲什麼?

我也有以下但它不應該影響順序,應該嗎?

for company in company_list.iterator(): 
    companies[company.id] = company 

上面的列表是基於在最近的代碼段companies打印。

+0

不,這是相關的,但如果你已經切片查詢集返回25個對象,你爲什麼用'.iterator( )'?只有避免將所有對象加載到內存中才有用。 – Selcuk 2015-03-08 17:23:36

+0

也許試試'Company.objects.defer(「bic」)。order_by(「name」)[:25]'或者使用'Company.objects.order_by(「name」)[:25]'完全放棄延遲。 – 2015-03-08 18:02:50

+0

@aus_lacy沒有區別。 – MikkoP 2015-03-08 18:28:11

回答

0

問題解決了。

我實際上是從數據庫中以正確的順序獲取它們,但之後我如前所述迭代它們。

for company in company_list.iterator(): 
    companies[company.id] = company 

我不知道字典沒有順序。我認爲這就像Java中的ArrayLists。他們保持他們插入的順序。後來我用這本字典打印出公司。

我將公司類型從字典改爲OrderedDict,並解決了問題。的

因此而不是

companies = {} 

我做

companies = OrderedDict() 
0

還有就是Django QuerySet文檔中的一節,規定:

注意用iterator()上已經被評估將迫使它重新評估,重複查詢一個QuerySet。

所以,如果你正在調用迭代器,那麼它將重新評估QuerySet,這可能會導致排序的差異。

如在第一條註釋中提到,沒有必要使用一個迭代,因爲你已經形成QuerySet與線

Company.objects.order_by("name").defer("bic")[:25] 
+0

這對於以前沒有任何影響。使用Django調試工具欄,我抓住了正在執行的查詢,並用SQLite Administrator在數據庫上手動執行它。這些結果被正確排序。 – MikkoP 2015-03-08 19:23:52