2012-08-25 29 views
0

您好我試圖將DataStore背後的概念作爲無SQL數據庫,我試圖獲取的是一個對象的列表,它已被另一個「引用」。由於這谷歌App Engine返回對象與參考集

class Person(db.Model): 
    name = db.StringProperty(required=True) 

class Contact(db.Model): 
    name = db.StringProperty(required=True) 
    email = db.StringProperty() 
    trader = db.ReferenceProperty(Person) 

這工作得很好,他們得到當我使用person.put()沒有任何問題進行保存。但是當我嘗試檢索它並將其編碼爲json時,它的內聯向我顯示聯繫人作爲列表,實際上它完全忽略了它。

persons_query = Person.all() 
    persons = persons_query.fetch(50) 
    data = json.encode(persons) 

我希望人有一個聯繫人的集合,但它不知道如何解決這個問題?

這樣可以很清楚目前我得到的東西是這樣的:

[ 
{ 
    name: "John Doe" 
} 
] 

我想是

[ 
{ 
    name: "John Doe" 
    contacts: [{name:"Alex", email:'[email protected]'}] 
} 
] 

編輯

感謝所有你是對的,我需要獲取聯繫人的集合只有一個問題,因爲當聯繫人被編碼時,它遞歸地嘗試編碼交易者對象以及它的聯繫方式等。

因此,我得到了一個明顯的錯誤遞歸錯誤,解決方案顯然是從聯繫人中刪除交易者對象時,它正在編碼。

回答

1

讓你的類的自定義功能的toJSON

class Person(db.Model): 
    name = db.StringProperty(required=True) 

    def toJson(self): 
     contact = self.contact_set #this is the default collection name for your class 
     d = {"name":self.name,"contact":contact} 
     return json.dumps(d) 

class Contact(db.Model): 
    name = db.StringProperty(required=True) 
    email = db.StringProperty() 
    trader = db.ReferenceProperty(Person) 

,那麼你可以做FF:

persons_query = Person.all() 
persons = persons_query.fetch(50) 
data = person.toJson() 
0

如果您想查找包含某人的所有聯繫人,則需要爲其發出查詢。

contacts = Contact.all().filter("trader =", person) 
+0

如果我想找回在同一個對象的所有人員和他交往? – Necronet

+1

您必須對Person對象中的聯繫人進行非規範化並存儲副本。如果您經常查詢人員,這可能是一個很好的方法,因爲這樣可以避免查詢聯繫人。但是,它也將由您來保持數據與實際聯繫人同步。或者,如果您不介意執行額外的查詢,則可以將兩者合併爲一個字典並通過json編碼器運行。 – dragonx

1

要取你需要編寫自定義的JSON編碼器,它獲取所有參考特性的反向的所有聯繫人。

ReferenceProperties自動獲得反向查詢。從文檔中,「collection_name是要引用的模型類的屬性的名稱,該屬性的值是引用實體的所有實體的查詢,如果沒有設置collection_name,則modelname_set(引用的名稱模型以小寫字母和_set添加)被使用。「

所以你會添加一個方法來解決反向參考集查詢。

class Person(db.Model): 
    name = db.StringProperty(required=True) 
    def contacts(self): 
     return self.contact_set.fetch(50) # should be smarter than that 

然後在您的自定義json編碼器中使用它。