django model ORM惰性求值

最近用 django 1.11 寫點東西,由于處理的數據庫部分關聯比較多,目前棘手的問題是處理數據匯總部分。需求如下:


存放根據區域進行匯總的一張表(圖1)

其中 project_id << category_id<<bigtype? ,然后每次進行匯總的時候實際上我會存在一個全局變量來說明這是第幾期報表,以此避免每次匯總的時候數據庫進行不必要的麻煩操作。代碼示例如下:


只取出當月創建的 record 記錄,因為在前端部分我只想顯示當月記錄的變化

其中 record 表為最詳細的一張表,district 、category、bigtype 以及 project 在此張表中都是有描述的,并且通過外鍵對應到各自 model 表的主鍵。

根據上圖數據庫部分,由于 record 表中其實在當月是存在4條記錄,但是 district 實際上為2種分離,bigtype 為1種分類, category為1種分類,project為 2種分類。實際關系我通過如下圖來表示:


其實最終結果就是在 category匯總求和就行了,只要詳細到category層

目前在 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 的惰性求值問題。


只對最后的一個元素進行了count(),主要原因是record_list實際上填充的是QuerySet元素,只在需要處理的時候才會去真正的處理

目前這部分在我自己的業務處理層面上是個bug,今天本來打算搞完休息的。。。已經一天耳鳴,轟轟的不行了,不過還是想堅持把這篇博文寫好再休息吧。


后期解決了這個問題,我再繼續補充(未完待續。。。。。。。。。。)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉載,覺得這篇寫 SQLAlchemy Core,寫得非常不錯。不過后續他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,462評論 1 14
  • 閑得看了兩部關于欺騙的電影。 浩君與小柔或多或少自我欺騙,彼此欺騙;偉同和Simon欺騙了父母,偉同爸爸也欺騙了他...
  • 一 偌大的禮堂空空如也。 風從不知名的方向吹來,逆時針輻散。 “北半球的氣旋?!鼻缱闲?,為什么考試的時候就想不到呢...
    青苔之城閱讀 336評論 0 3
  • 感恩今天涼爽的天氣,讓人感到非常的舒服! 感恩送前臺柜師傅的好服務,幫我一起把前臺柜送上樓,辛苦! ...
    做優雅的女人閱讀 171評論 0 1
  • 1、花了十五元買了一棵大樹菠蘿。老爸為了趕在他今晚出去坐車上廣州、趁著傍晚和我到沙壩地找了個地方種了。 2、成錦從...
    A君閱讀 187評論 0 1