Django 用 aggregate 和 annotate 來表示 SQL 中 group by 的效果,讀完 Aggregation 的說明應該就會知道怎麼用。
SELECT MAX(a), MIN(b) FROM some_table 還滿容易的。像 Book.objects.aggregate(Max('price')) 相當於 SELECT MAX(price) FROM book。annotate 則是對 QuerySet 裡每筆資料做 aggregation, 比方 Book 和 Author 是 many-to-many relation, 可以用 Book.objects.annotate(Count('authors')) 算出每本書各有幾位作者。
注意若 group by 後還想繼續用 filter 之類的方法操作 aggregation 產生的 field 的話, 要改變 aggregate / annotate 產生的欄位名稱, 預設會用 field__operator 的名稱 (如 authors__count)。但名稱中有兩個底線時, 就沒法再塞到 filter 的 key 裡, 不知這算不算 bug 啊。所以若要選出有兩位作者以上的書時, 得寫成 Book.objects.annotate(nauthor=Count('authors')).filter(nauthor__gte=2)。
SELECT F, MAX(A) FROM ... GROUP BY F 比較難做, 要透過 values。先用 values 轉成 ValueQuerySet, 再用 aggregate / annotate。我寫這篇也只是要記 values 的連結而已, 因為 google "django group by" 看一會兒沒找到它......。最近碰 Django 的東西, 總覺得還是乖乖把文件掃完一遍比較快, 用關鍵字太難找了。
2010年4月22日 星期四
訂閱:
張貼留言 (Atom)
在 Fedora 下裝 id-utils
Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...
-
find -uid 可以找目錄下特定使用者有的檔案, 反過來不知怎麼找。 今天靈機一動, 想到可以這麼搞, 不夠直接, 至少能用就是了: ls -lR DIR | grep "^[-rw]\{10\} " | grep -v USER 2011-01-...
-
Captive Portal 是指在可以正常用網路前, 先導到一個登入網頁, 登入後才可以正常上網。通常用在需要付費上網的地方, 或是飯店提供免費但需帳號登入的 Wi-Fi。不過不限於 Wi-Fi 連線 這樣作的好處是使用者可以透過網頁看到比較詳細的說明, 像是「使用者同意書...
-
在討論 HTTPS Proxy 前, 要先分清楚是在講那件事: Proxy 和 client 之間的連線用 HTTPS Proxy 允許 client 透過它往外用 HTTPS 連線 前者的好處是保護 client 和 Proxy 之間的連線, client 若是用 ...
沒有留言:
張貼留言