2008-12-21 255 views
7

我只是想嘗試用django構建一個項目。因此,我有一個關於如何管理這樣一個項目的(基本)問題。由於我找不到任何關於如何將項目拆分爲應用程序的指南等。你如何管理你的Django應用程序?

讓我們以一種SO爲例。你會使用哪些應用程序? 我想說應該有應用程序「用戶」和「問題」。但是如果有靜態文章的話題系統呢。也許他們也可以收到選票。 那麼如何構建應用程序結構呢?一個應用程序的「問題」,「投票」和「主題」或只是一個應用程序「內容」?

我不知道該怎麼做。也許是因爲我對Django的瞭解不多,但我也很感興趣......

回答

0

我會告訴你我是如何接近這樣的問題的:我通常坐在一張紙上畫框(功能)和箭頭(功能之間的相互依賴關係)。我確信有方法或其他方法可以幫助你,但我的方法通常適用於我(YMMV,當然)。

儘管知道網站應該是什麼是基本的。 ;)

+0

但是,在哪一個功能與另一個功能之間畫線? – okoman 2008-12-21 12:13:15

5

您應該嘗試儘可能多的應用程序分離項目。對於大多數項目,應用程序不會包含超過5個模型。例如,像SO這樣的項目將爲UsersProfiles,Questions,Tags(django中有一個爲此準備就緒的應用程序)等單獨的應用程序。如果有一個靜態頁面的系統也將是一個單獨的應用程序(有準備好的以此目的)。您還應該嘗試儘可能使您的應用程序儘可能通用,以便您可以在其他項目中重用它們。在可重複使用的應用上有很好的presentation

+3

+1:小而可重用 - 專注於一個或幾個密切相關的實體。 – 2008-12-22 02:48:27

3

就像任何一組依賴關係一樣......嘗試找到項目中最有用的獨立方面並製作這些獨立應用程序。其他Django應用程序將具有更高級別的功能,並重用您設置的最低級別應用程序的各個部分。

在我的項目中,我有一個日曆應用程序,在其模型中具有自己的Event對象。我還設置了拼車數據庫,並且在我的RideShare表中使用日曆的Event對象的出發時間和持續時間。拼車數據庫具有日曆識別功能,並可從日曆應用程序中獲取所有nice .ics出口和日曆視圖的「免費」。

有一些技巧可以讓應用程序可重用,比如命名模板目錄:project/app2/templates/app2/index.html。這可以讓你從任何其他應用程序引用app2/index.html,並獲得正確的模板。我選擇了一個在Django中查看內置的可重用應用程序。 Pinax在尺寸方面有點怪,但它也展示了一個很好的可重用App結構。

如果有疑問,現在就忘記可重複使用的應用程序。把所有的消息和民意調查放在一個應用程序中,並通過一次修改。在這個過程中,你會發現哪些步驟是不必要的,並且可以在未來獨立出來。

6

有沒有硬性規定,但我認爲最好是在更專業的應用程序方面犯錯。理想情況下,應用程序只應處理一項功能問題:即「標記」或「評論」或「授權/驗證」或「帖子」。這種類型的設計還將幫助您重複使用可用的開源應用程序,而不是重新發明輪子(即Django自帶authcomments應用程序,django-taggingdjango-taggable幾乎可以確實滿足您的需求等)。

Generic foreign keys可以幫助您將可能應用於其他應用程序模型的應用程序(如標記或註釋)分開。

3

在決定是否編寫應用程序時問自己一個很好的問題是「我可以在另一個項目中使用它嗎?」。如果你認爲你可以,那麼考慮如何使應用程序儘可能獨立;如何減少依賴關係,以便應用程序不依賴特定項目的任何特定內容。

一些你可以做到這一點的方法是:

  • 給予每個應用程序自身的urls.py
  • 允許模型類型將作爲參數傳遞,而不是明確地宣佈哪些車型在使用你的觀點。通用視圖使用這個原則。
  • 通過在您的urls.py中傳遞某種template_name參數,輕鬆覆蓋您的模板
  • 請確保您可以使用對象和視圖執行反向URL查找。這意味着在urls.py中命名您的視圖並在您的模型上創建get_absolute_url方法。
  • 在某些情況下,如標記,可以使用GenericForeignKeys將應用程序中的模型與任何其他模型相關聯,而不管它是否有ForeignKeys「回顧」它。
相關問題