2011-04-27 36 views
2

我有以下2類:如何從兩個GQL類中提取數據?

class UsersRSS(db.Model): 
    userId = db.IntegerProperty() 
    fileHash = db.StringProperty() 
    added = db.DateTimeProperty(auto_now_add=True) 

class Files(db.Model): 
    fileHash = db.StringProperty() 
    title = db.StringProperty() 
    file = db.BlobProperty() 
    added = db.DateTimeProperty(auto_now_add=True)  

我需要創建一個GQL查詢,將兩個表中返回一個數據:

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id) 

但每次item除了fileHashadded領域,應包含來自第二類的字段 - titlefile(匹配應該由fileHash字段完成)。

回答

4

無法從Datastore檢索不同的種類使用相同的GQL Select語句

另一種選擇是使用ReferenceProperty創建UsersRSSFiles之間的多到一的關係,重構你的代碼是這樣的:

class UsersRSS(db.Model): 
    userId = db.IntegerProperty() 
    file = db.ReferenceProperty(Files) 
    added = db.DateTimeProperty(auto_now_add=True) 

class Files(db.Model): 
    fileHash = db.StringProperty() 
    title = db.StringProperty() 
    file = db.BlobProperty() 
    added = db.DateTimeProperty(auto_now_add=True) 

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id) 

這樣,在Files屬性將被自動取消引用使用item.file.title點符號:

for item in items: 
    print item.UserID 
    print item.Added 
    print item.file.title #This costs an additional RPC call to Datastore 

要從RPC的ReferenceProperty節省開銷,你的App看看在北極常青le ReferenceProperty prefetching

+1

謝謝!如何使用這種方法將'file'添加到'UsersRSS'? 'file = Files(key_name =「z」+ self.request.get('hash')); file.put(); fileRecord = UsersRSS(); fileRecord.file =文件; fileRecord.put()'是否正確? – 2011-04-27 17:13:29

+0

沒錯,你可能忘了在'fileRecord.put()'之前把'userId'設置爲'fileRecord'。 – systempuntoout 2011-04-27 17:51:19