最近用 django 1.11 寫點東西,由于處理的數據庫部分關聯比較多,目前棘手的問題是處理數據匯總部分。需求如下:
其中 project_id << category_id<<bigtype? ,然后每次進行匯總的時候實際上我會存在一個全局變量來說明這是第幾期報表,以此避免每次匯總的時候數據庫進行不必要的麻煩操作。代碼示例如下:
其中 record 表為最詳細的一張表,district 、category、bigtype 以及 project 在此張表中都是有描述的,并且通過外鍵對應到各自 model 表的主鍵。
根據上圖數據庫部分,由于 record 表中其實在當月是存在4條記錄,但是 district 實際上為2種分離,bigtype 為1種分類, category為1種分類,project為 2種分類。實際關系我通過如下圖來表示:
目前在 django model ORM 中,本人還沒有摸索到高級用法,現在遇到尷尬的地方是:
1、能夠取出當月新添加的記錄,如圖1所示,那么實際上 district 區域可能變動的就只有 project,但是實際遍歷的時候我肯定還是要把兩條記錄拿出來,只要記錄中有一條不同字段的記錄肯定是不同的記錄。
2、1中描述就會導致實際上我會走 district 的4層遍歷,僅僅是 district, 由于在匯總的時候我寫了 for 循環(目前還未用 ORM 高級處理方案,還需要詳細看下 Queryset API 的文檔),通過在? category 層 進行記錄的跟新。如此處理就會導致 實際上的寫入了兩次相同的最終結果,本質原因在于對于 district 的 3、4 各做了兩次循環處理,實際上最終匯總應該是只落實到 category 層,前面相同的字段在匯總結果中是無關的,只是在 record 明細表中確實要區分。
針對以上問題,有個最簡單的處理方法:
由于事先我能夠把控在 record 記錄中存在多少 district 字段的記錄,通過去重后遍歷,這個時候必須附屬一個字段舉例為 district_count,作為后續循環處理中 continue 的的觸發值。根據 district_count 作為根據在 record 表中進行匯總的遍歷次數。
思路是以上思路,但是由于代碼已經拖拉的挺長了,想組織 dict 的形式去處理,目前遇到一個 比較麻煩的問題就是 django model ORM 的惰性求值問題。
目前這部分在我自己的業務處理層面上是個bug,今天本來打算搞完休息的。。。已經一天耳鳴,轟轟的不行了,不過還是想堅持把這篇博文寫好再休息吧。
后期解決了這個問題,我再繼續補充(未完待續。。。。。。。。。。)