2008年8月23日

GAE 中 Datastore 的小陷阱

Google app engine 平台 + GAEO超好用公佈欄時,發現 Datastore 在使用時有小陷阱要小心。

資料間的連結關係有 one-to-one, one-to-many, 以及 many-to-many 三種,如何在 Datastore 實做可以參考[AppEngine] 實戰 Datastore (1)這篇文章。

當時實做 one-to-many 時,對 Datastore 不熟悉,所以寫出了像下面的程式碼

parent.children.order('-date')
self.children = parent.children

parent 是自定義 class, children 是自定義 class 所串成的 list,parent 和 children 的關係是 one-to-many。所以會很自然的認為 parent.children.order(`-date') 意思是這個 parent 底下的 children 依照最新到最舊的日期排序。然後直接將已排序好的 parent.children 指定給 self.children ,讓相關的網頁存取 children。

但這樣的想法是錯的,網頁呈現出來的依然是沒有排序過的資料。
文件中,The Query Class的 order() method 描述

Adds an ordering for the results. Results are ordered starting with the first order added.

重點是 Results ,要接了 return 的值後才是有排序過的資料。

只要改成下列程式碼後,結果就正確了。

childQuery = parent.children.order(`-date')
self.children = childQuery.fetch()

或直接接 return 值,也是可以。

self.children = parent.children.order(`-date')

我被文件前面的例子給誤導了


query.filter(`title =`, `Imagine')
query.order(`-date')
query.ancestor(key)
query.filter(`title =`, `Imagine').order(`date').ancestor(key)

以為 query.order(`-date') 後,query 裡的資料就已經排序好了。
所以,不管你如何串接,最後一定要接傳回值才是正確的結果。

沒有留言: