Django的models的分層設計(避免循環引用)

在一個Django項目中,通常都會有多個app,在每個app中都有一個models.py文件用來存放相應的模型類(模型類是數據庫表的映射)。而在模型類與模型類之間很有可能會存在某種關聯,比如外鍵關聯,這時,相關聯的模型類很有可能不在同一個models.py文件中,很有可能是跨越了app來關聯的。這時,如果app1中的models.py文件引用了app2中的models.py文件來建立外鍵關聯,而app2中的models.py文件也恰好引用了app1中的models.py文件來進行外鍵關聯,這時就發生了循環引用,在Python中循環引用是會報錯的。

如上圖所示,假設在一個Django項目中兩個app,分別是users(用戶相關),goods(商品相關),在users的models.py文件中有兩個用戶相關的模型類,分別是Users(用戶信息),UserOrders(用戶的訂單信息),在goods的models.py文件中有兩個商品相關的模型類,分別是Goods(商品信息),GoodComments(商品的評論)。到這裏,我們可以想到,UserOrders肯定會和Goods通過外鍵關聯起來,而GoodComments也肯定會和Users通過外鍵關聯起來,這樣他們就進行了循環引用。

因此,我們將採取一種方法來解決這種循環引用的問題,就是標題提到的分層設計,分層我們指的是將app進行分層(即:models.py分層,因爲models.py在app內部),下層不能引用上層,而上層可以引用下層,這樣就可以保證不會發生循環引用了。

還是以上面那裏例子來說明:

如圖所示,我們在原來的兩個app中只存放了各自的實體模型類:Goods和Users,因爲這兩個類肯定會被其他的類引用,而這兩個類不會去引用其他的類,所以我們將這兩個類所在的app放在了最下層,同時我們又創建了一個app:operations,我們將之前發生相互引用的模型類放在這個app裏面,而這個app處於上層,可以去引用下層的模型類來製造關聯。這樣就避免了循環引用。

這只是一個簡單說明封層設計的例子,實際開發中肯定要比這個複雜得多,可能會分成很多層,但是,只要我們在設計app時,加入分層設計思想,將項目結構建立好,而不是隨意的將模型類放在一個app的models.py文件中,那麼,我們在開發的過程中可以減少很多煩惱。

分層設計的思想不只是避免了循環引用,同時也使得我們的項目結構更加清晰明瞭,有助於項目的開發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章