2008-11-29 59 views
0

我的情況,我需要跨越像in the Django database model查詢谷歌App Engine的實體關係是。我使用ListProperty S代表一個一對多的關係,就像這樣:GQL查詢,以有效地跨越實體關係

class Foo(db.Model): bars = db.ListProperty(db.Key) 
class Bar(db.Model): eggs = db.ListProperty(db.Key) 

而且我想執行一個查詢,執行以下操作:

# Foo.filter('bars.eggs =', target_egg) 
[foo 
for egg in eggs if egg == target_egg 
for eggs in bar.eggs 
for bar in foo.bars 
for foo in Foo.all()] 

的理解似乎根本低效。我真的很想執行查詢作爲註釋部分,但它並不像the GQL syntax允許對屬性的屬性查詢:

SELECT * FROM <kind> 
    [WHERE <condition> [AND <condition> ...]] 
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]] 
    [LIMIT [<offset>,]<count>] 
    [OFFSET <offset>] 

    <condition> := <property> {< | <= | > | >= | = | != } <value> 
    <condition> := <property> IN <list> 
    <condition> := ANCESTOR IS <entity or key> 

回答

3

你是對的,App Engine數據存儲沒有按不允許這種查詢。你說得對,列表理解是無效的。不過考慮一下,當你用像你這樣的連接執行一個查詢時,這與關係數據庫幾乎完全相同 - 數據庫必須執行與你在這裏執行相同的O(n^3)工作 - 唯一的區別是你是用Python做的,還有額外的往返時間。由於App Engine旨在進行擴展,因此它不是真正用於這類查詢。

通常情況下,您可以通過移動您需要訪問的某些屬性到Foo模型,或者如果您正在執行聚合,通過將總數移動到Foo模型。但是,如果沒有更多關於你想要解決什麼問題的想法,就很難給出具體的解決方案。