2010-01-22 40 views
4

我想聽聽你對此的看法。Django過濾器的作用。在視圖中過濾或預先格式化?

我有一個django應用程序,從模型中獲得的數據很粗糙。爲了使它們更好,我必須做一些潛在的複雜操作,但不是太多。 舉個例子,假設你有一個模型,其中美國國家編碼爲兩個字母代碼。在html渲染中,您想要爲用戶呈現完整的狀態名稱。我有另一個數據庫表中的通信雙字母 - >全名。假設我不想執行連接。

我有兩個選擇

  1. 有視圖代碼提取模型中的兩個字母的信息,然後執行對第二表的查詢,得到的全名,並把它在上下文。模板呈現完整的狀態名稱。
  2. 創建一個自定義過濾器,它接受雙字母代碼,命中數據庫並返回全長名稱。讓視圖將雙字母信息傳遞到上下文中,並將模板中的管道放入過濾器中。篩選器將雙字母代碼呈現爲完整字符串。

現在,這些解決方案似乎是等同的,但它們不可能,也從設計角度來看。我對在過濾責任和觀點責任之間劃清界限表示懷疑。解決方案1正在完成解決方案2中的過濾器任務,它只是集成在視圖本身中。當然,如果我必須在同一頁面內多次調用過濾器,解決方案1可能會更快(除非過濾器輸出已被記憶)。

對於設計,正確的編碼和性能,您有什麼看法?

回答

2

在我看來,你的模型應該有一個方法來做轉換。這似乎是額外的工作,使過濾器,我不認爲大多數Django開發人員會期望過濾器中的那種事情。

過濾器意味着更通用 - 格式化和顯示數據而不是查找。

2

我的看法是,從設計的角度來看,第一種解決方案更清潔。我希望看到模板圖層僅作爲演示文稿的最後階段,其中所有信息都以視圖的形式傳遞(以其最終形式)。

在視圖中擁有所有「計算邏輯」更好。也就是說,道:

  • 它更容易閱讀理解(尤其是第三方)。

  • 我需要變化的東西,你可以專注於一個特定視圖的方法,並確保您需要更改一切都在那裏(無需從視圖中來回切換到模板)。

至於表現,我認爲你的觀點是對的。如果您想多次執行相同的查找,第二種解決方案會更糟糕。

編輯: 參考ashchristopher的評論,我其實是想說,它絕對不會屬於模板。關於「數據提供」和「商業邏輯」之間的界線在哪裏,業務邏輯究竟是什麼以及哪裏是不明確的。在這種情況下,似乎ashchristopher是對的。狀態碼到全狀態名稱的轉換可能是與數據庫相關的編碼問題,而不是業務邏輯。

+1

雖然我同意這兩個解決方案中的第一個是更好的......我仍然認爲這個模型就屬於這個範疇。該模型不僅僅是數據庫的一個接口。它應該被用來收集和處理數據。 該視圖用於執行業務邏輯,並將alpha-2國家/地區代碼轉換爲全名很難做到業務邏輯......它是數據操作。 – ashchristopher 2010-01-22 04:52:39

+0

這是一個很好的觀點。編輯我的答案。 – 3lectrologos 2010-01-22 06:30:54