[英]models.py getting huge, what is the best way to break it up?
來自我的主管的指示:“我想避免在models.py
任何邏輯。從現在開始,讓我們將其用作訪問數據庫的類,並將所有邏輯保存在使用模型類的外部類中,或者包裝他們。”
我覺得這是錯誤的方式。 我認為保持模型邏輯只是為了保持文件小是一個壞主意。 如果邏輯在模型中是最好的,那么無論文件大小如何,它都應該去。
那么有一個簡單的方法來使用包含? 在PHP中,我想向主管建議我們只有models.py
include()來自其他地方的模型類。 從概念上講,這將允許模型具有我們想要的所有邏輯,但通過增加文件數量來減少文件大小(這會導致較少的修訂控制問題,如沖突等)。
那么,是否有一種從models.py文件中刪除模型類的簡單方法,但仍然可以使用所有Django工具的模型? 或者,對於“大型”models.py文件的一般問題,是否存在完全不同但優雅的解決方案? 任何輸入將不勝感激。
模型類包含在模型上操作的方法是很自然的。 如果我有一個Book模型,使用方法book.get_noun_count()
,那就是它所屬的地方 - 我不想寫“ get_noun_count(book)
”,除非該方法實際上本質上屬於其他一些包。 (例如,如果我有一個用於訪問亞馬遜API的軟件包,請使用“ get_amazon_product_id(book)
”。)
當Django的文檔建議將模型放在一個文件中時,我感到很沮喪,我從一開始就花了幾分鍾時間弄清楚如何將它拆分成一個合適的子包。
site/models/__init__.py
site/models/book.py
__init__.py
看起來像:
from .book import Book
所以我仍然可以寫“from site.models import Book”。
以下僅適用於Django 1.7之前的版本,請參閱https://code.djangoproject.com/ticket/3591
唯一的技巧是由於Django中的錯誤,您需要顯式設置每個模型的應用程序:它假定應用程序名稱是模型路徑中倒數第三個條目。 “site.models.Book”導致“site”,這是正確的; “site.models.book.Book”使它認為應用程序名稱是“模型”。 這是Django的一個非常討厭的黑客攻擊; 它應該可以在已安裝的應用程序列表中搜索前綴匹配。
class Book(models.Model):
class Meta: app_label = "site"
您可以使用基類或元類來概括這一點,但我還沒有打擾過它。
Django旨在讓您構建許多小應用程序而不是一個大型應用程序。
在每個大型應用程序中都有許多小型應用程序在努力獲得自由。
如果你的models.py
感覺很大,那你就做得太多了。 停止。 放松。 分解。
查找較小的,可能可重復使用的小型應用程序組件或部件。 您不必實際重用它們。 試想一下它們可能是可重用的。
考慮您的升級路徑並分解您可能希望在某一天更換的應用程序。 您不必實際替換它們,但您可以將它們視為編程的獨立“模塊”,可能會被未來更酷的東西取代。
我們有大約十幾個應用程序,每個model.py
不超過大約400行代碼。 他們都非常專注於不到六個不同的類定義。 (這些不是硬限制,它們是對我們代碼的觀察。)
我們早期和經常分解。
我不太可能得到你可能遇到的許多問題。 以下是答案的一些可能性:
同一文件中的多個模型
將它們放入單獨的文件中。 如果存在依賴關系,請使用import來提取其他模型。
models.py中的無關邏輯/實用函數
將額外的邏輯放入單獨的文件中。
從數據庫中選擇一些模型實例的靜態方法
在單獨的文件中創建新的Manager 。
方法顯然與模型有關
save,__ unicode__和get_absolute_url就是例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.