不在models.py中的models

昀溪發表於2018-08-09

概述

如何讓你定義的model不在models.py中

在app的models目錄中的models

你新建一個app後這個models.py就會自動建立,裡面只有幾行程式碼。那麼如果是一箇中大型專案,每個app裡面可能需要建立很多表(一個表就對應models.py裡面定義的一個class),那把這些類都寫在一個.py檔案中顯然不是一個好主意,主要是不利於維護,那麼我們是否可以把那些對應表的類寫在單獨檔案中,並且這些單獨檔案統一在一個目錄中呢?當然可以,如下圖:

這種結構看起來清晰明瞭但是如何使用呢?

我們實際上是在report這個app裡建立了一個名為models的Python Package(而且名稱必須是models)這時候它會自動建立一個__init__.py檔案,這個檔案通常情況下是空的,但是在當前情況下你就需要格外注意需要在這個檔案中新增一些東西,如下圖:

如上圖所示也就匯入在models包裡面的模組以及模組裡面的類,目的是對app可見,而且你models裡有多少個模組,這裡就要匯入多少。透過上面這種結構你就可以把model放在app預設的models.py外面。下圖是settings.py檔案

 

但是要使用這種單獨models目錄的結構需要注意一下幾點:

  • 新建的Python Package名稱必須叫做models,因為預設會檢查models.py檔案(透過<app>.models),所以需要一個名稱相同的目錄,而目錄中的__init__.py則完成後續的匯入工作。所以如果你用一個其他名字則不能使用這種結構。
  • 在settings.py的INSTALLED_APPS中宣告你建立的app
  • 雖然在單獨的目錄中但是你定義的model也依然可以被訪問,就像它們被定義在models.py檔案中一樣。訪問路徑依然是app.models

使用自定義名稱

如果我不想使用models這一的目錄而是想自己起一個更好聽的名字可以嗎?當然可以。

在自定義models目錄場景中,就需要使用預設的models.py檔案,目的是在這裡匯入哪些你自己定義的目錄以及模組還有模組裡面的類,除了這一點其他設定和上面第一種場景一致。另外自定義名稱的models目錄(上圖中ConsuomModels)裡面的__init__.py保留為空即可。

參考文章 Django models outside of models.py

相關文章