2011-05-11 22 views
12

我是一個Django初學者,一直試圖儘可能地分離我的應用程序,並儘可能將其構建成儘可能小的可重用部分。試圖遵循James Bennett的構建re-usable apps的策略。考慮到這一點,我遇到了這個問題。創建可重用的Django應用程序?

比方說,我有這樣的存儲有關的電影信息的應用程序:

的代碼會是這個樣子:

class Movie(models.Model): 
    name = models.CharField(max_length=255) 
    ... 

現在,如果我想增加收視率,我可以使用Django評級和一個簡單的字段添加到我的模型:

class Movie(models.Model): 
    name = models.CharField(max_length=255) 
    rating = RatingField(range=5) 
    ... 

這在本質上意味着我的電影的應用程序現在依賴於Django的收視率,如果我想重新使用它,但不再需要收視率,我仍然必須安裝Django的評級或修改和分離我的應用程序。

現在,我可以通過嘗試/除了導入來解決這個問題,如果成功定義字段,但現在我的電影應用程序顯式綁定到數據庫表定義中的評級。

分離兩個模型並在評級模型而不是電影中定義關係似乎更合理。這種方式的依賴關係是在使用評分時定義的,但在使用Movie應用程序時不需要。

你如何處理這個問題?有沒有更好的方法來分離模型?

我也想知道這樣做是否有任何主要表現懲罰。

編輯:我想澄清一下,這更像是一個問題的例子,而且有些人爲了說明這一點。我希望在每次需要添加相關數據時都能夠添加更多信息,而無需修改「電影」模型。我很欣賞迄今的迴應。

+3

我愛你所有的電影,男人。 – zeekay 2011-05-11 03:41:57

回答

4

在這種情況下,我會保持簡單,只需在模型上留下rating即可。你必須平衡可重用性和簡單的實現。能夠重複使用是件好事,但是您的模型是否真的有用以保證額外的工作?這是不是有一個依賴?我認爲很多這些設計決定都是主觀的。今年在PyCon上有一個很好的演講:http://blip.tv/file/4882961

1

首先,我同意上面的zeekay,你應該反思一下,對於你的模型來說,這種可重用性是否值得。

如果確實如此,您可以創建一個新的movierating應用程序,該應用程序的RatingModel的FK爲movies.models.Movierating字段。

您將永遠不會將rating以某種方式通過模板。爲此,您可以創建class-based-views,並在movierating.views中擴展並覆蓋get_context方法。

不要忘記實現可重用性是一個根本性的價值判斷,開發者必須作出和過度做的不是在不該這樣做也可能是壞。

0

有依賴關係不一定是壞事。對於類似字段(rating,timedelta,JSON對象)的內容,如果沒有內建字段可以滿足您的需求,則必須包含處理該字段的一個獨立應用程序(也可能包含一些相關功能,如模板標記),這是一項功能,不是一個錯誤。

更多的問題是當你的應用程序的模型參考其他應用程序的模型。當然,這發生在現實世界中,但在這種情況下,識別孤立模型變得更加困難。

相關問題