2012-02-26 20 views
0

所以,我的問題是這樣的。我有一個傳統的MySQL數據庫,我正在構建一個閃亮的新Django應用程序。無論出於何種原因,做出了一些相當愚蠢的設計決定 - 例如所有字段,不管它們包含什麼,被存儲爲變量 - 但是因爲由於其他我不重寫的系統依賴於相同的數據,我不能破壞性地改變該模式。修改QuerySet中返回的模型實例中的字段是否一個好主意?它會殺死性能?

我想對待某一領域 - 股票上的數量手作爲一個整數,所以,在我的模板,我可以檢查它的量,並顯示相關的值(基本上,如果有超過100項可用,我只想顯示「100+可用」)。

股票數量現有的值存儲爲,奇怪的是,一個varchar拿着浮動(如是否有可能有分數數額的股票的項目):

item.qty: u"72.0" 

現在,我想作爲一個最糟糕的情況是我可以使用QuerySet.values(),並迭代結果,用int()解析的版本替換每個庫存數量。就像...

item_list = items.values() 
for item in item_list: 
    item['qty'] = int(float(item['qty'])) 

...但不會導致我的QuerySet完全評估自己?我承認對Django處理查詢懶惰執行的過程相當無知,但似乎使用實際值將意味着在需要之前對查詢進行評估。所以,我是不是抱怨什麼(我的意思是,它絕對是在模板中評估這些值),還是有更好的方法來做我需要做的事情?

+0

你考慮讓來自Django模塊一個新的數據庫和舊數據遷移到了嗎?它更簡單,結果應該更好。 – jpic 2012-02-26 13:28:29

+0

我做過了,但是使用傳統ERP系統將數據插入到數據庫中:我基本上只是閱讀它。要打破與舊系統的聯繫,意味着要建立一套完整的ERP系統替代品,以及他們不願意支付的費用。 – HowlingEverett 2012-02-26 13:41:21

回答

0

是的,迭代通過視圖將評估整個查詢集。這可能不是你想要的 - 例如,如果你分頁,分頁器會自動限制查詢,所以你不想單獨評估整個事情。

我會以不同的方式處理這個問題,方法是調用模板中的函數來格式化數據。您可以使用的方法做到這一點的模型,如果有要格式化只是一個字段:

class Item(models.Model): 
    ... 
    def get_formatted_qty(self): 
     return int(float(self.qty)) 

,並稱之爲:

{{ item.get_formatted_qty }} 

或者,使其更一般情況下,你可以在templatetags定義自定義過濾器:

@register.filter 
def format_value(value): 
    return int(float(value)) 


{{ item.qty|format }} 
+0

我只是想出了模型方法可以解決我的問題,但是自定義過濾器會使我的模型保留很多重複。謝謝! – HowlingEverett 2012-02-26 14:17:47

相關問題