首發(fā)于小社群(碼農(nóng)悟凡公眾號(hào)底部菜單可進(jìn))
原文地址:https://blog.doordash.com/tips-for-building-high-quality-django-apps-at-scale-a5a25917b2b5
整篇文章基本都是在講Model層的東西轴脐,對(duì)于Django的應(yīng)用政敢,Model至關(guān)重要糠睡。
關(guān)于項(xiàng)目結(jié)構(gòu)的部分,我懷疑這哥們是寫(xiě)錯(cuò)了硬纤,現(xiàn)在Django創(chuàng)建完app就是他建議的那種。
明確Model對(duì)應(yīng)的表明,這個(gè)明確些確實(shí)會(huì)好很多循帐,尤其是一個(gè)Model在不同的app中遷移的時(shí)候,如果不注意舀武,你可能得查半天關(guān)于表不存在的問(wèn)題拄养。
避免GenericForeignKey,之前有段時(shí)間我們也用過(guò)银舱,但是最大的問(wèn)題是瘪匿,這樣做會(huì)把Model耦合到表里面。不如自己實(shí)現(xiàn)來(lái)的方便寻馏。
關(guān)于migrations棋弥,個(gè)人感覺(jué)主要是開(kāi)發(fā)環(huán)境方便,生成環(huán)境你還用這個(gè)操软?那估計(jì)是瘋了嘁锯。
合并migrations,這個(gè)建議不錯(cuò)聂薪,一段時(shí)間后重新生成migrations家乘。
減少migration沖突,這個(gè)沒(méi)怎么遇到藏澳,不評(píng)論仁锯。
避免Model過(guò)肥,數(shù)據(jù)層就應(yīng)該干數(shù)據(jù)層的活翔悠,別摻雜業(yè)務(wù)到里面业崖,會(huì)很難維護(hù)。
謹(jǐn)慎使用Signals蓄愁,這個(gè)東西是解耦合的很好的方式双炕,但是不能濫用,太多的signal撮抓,自己找起來(lái)都困難妇斤,更別去跟蹤執(zhí)行過(guò)程和結(jié)果了。
避免使用ORM的接口作為主要依賴,這點(diǎn)很奇怪站超,再封裝出來(lái)一層沒(méi)啥意義荸恕,除非明確的知道以后要替換ORM。
不要CacheDjangoModel死相,這點(diǎn)主要是針對(duì)對(duì)象的緩存融求,在Django中,用自帶的緩存算撮,可以直接緩存一個(gè)對(duì)象實(shí)例進(jìn)去(pickle類的東西)生宛。the5fire也受過(guò)這個(gè)苦,變更Model后钮惠,重新部署項(xiàng)目茅糜,掛了。最終還是清理了緩存才ok的素挽。最佳建議是只緩存數(shù)據(jù)蔑赘。
關(guān)于第10點(diǎn)再補(bǔ)充一句,最新的PyCon2017上预明,instagram也遇到了類似的坑缩赛,不同Python版本之間pickle之后緩存相互不兼容。在生產(chǎn)環(huán)境中這是一個(gè)很危險(xiǎn)的操作撰糠。開(kāi)發(fā)環(huán)境測(cè)試酥馍,一切ok。誰(shuí)會(huì)想到緩存上會(huì)有問(wèn)題阅酪,畢竟緩存是隨時(shí)可以清的旨袒。
歡迎討論。
- from the5fire.com?
文章轉(zhuǎn)自:https://www.the5fire.com/