2011-03-28 54 views
2

我有兩個實體種類和一個參照其他類似:質疑的ReferenceProperty在谷歌應用程序引擎

class Entity1(db.Expando): 
    prop1=db.StringProperty() 
    prop2=db.StringProperty() 

class Entity2(db.Expando): 
    prop3=db.ReferenceProperty(Entity1) 
    prop4=db.StringProperty() 

我可以編寫一個查詢,如:

q=Entity2.all().filter("prop3.prop1 =",somevalue) 

這裏prop3具有參考和意志指的是Entity1的某個實體,我想知道所有那些Entity2的實體,它們指向具有prop1作爲某些值的Entity1的那些實體。

回答

0

定義實體2爲:

class Entity2(db.Expando): 
    entity_1_ref = db.ReferenceProperty(Entity1, collection_name = "set_of_entity_2_elements") 
    prop4=db.StringProperty() 

這定義了可以從參考的另一側進行操作的集合名稱。 (在這種情況下是Entity1)。我冒昧地將prop3重新命名爲更合適的東西。

現在你可以做q = entity_1_object.set_of_entity_2_elements(所有Entity1對象的新屬性),它會給你你想要的結果。

欲瞭解更多信息,請閱讀這篇文章深入:http://code.google.com/appengine/articles/modeling.html

更新:對不起,我弄錯了。以上建議犯規獲得只有那些在周圍的方式與entity_1_object.prop1 == somevalue

元素你仍然可以得到它,如下所示:

for obj in q: 
    if (obj.prop1 == somevalue): 
     # Do your processing here 

for obj in q: 
    if (obj.prop1 != somevalue): 
     # Delete this object from the list 'q' 

但顯然這不是最好的方法。讓我們等待更好的答案!

+0

thanx的答案,但在我的情況下,這不會工作,因爲避免每次的手動檢查實體我試圖使用ReferenceProperty,但似乎我的目的似乎不會被解決。好的,讓我們等待更好的答案。 – niteshb 2011-03-28 09:10:12

+1

@ user617462:你不會得到更好的答案;數據存儲不會進行連接。如果您需要定期執行此查詢,則可能需要進行非規範化處理,包括第二個模型中引用實體的'prop1'值。 – geoffspear 2011-03-28 13:02:00

1

Google Datastore不支持連接。你可以獲取Entity2的所有實體並做一些操作來實現你所說的。與@Mani的建議有些相似。但你可以這樣做

entities2 = Entity2.all() 
for entity2 in entities2: 
    Entity1= entity.prop3.get() 
    if Entity1.prop1== somevalue: 
     #Do your processing here 
+0

是的,我試過,但由於實體的數量非常大,需要花費很多時間,目的並沒有解決,所以我試圖用一個查詢來完成。這似乎只是一個手動檢查,而不是查詢。 – niteshb 2011-03-31 05:49:41

+0

這樣你就必須對你的模型進行非規範化處理。你所說的在單個查詢中是不可能的。引用屬性只是存儲密鑰,並且無法通過取出它來訪問它的屬性 – 2011-03-31 05:57:58

2

在我的示例中,我首先獲取引用屬性的鍵用作查詢的過濾器。然後,您可以根據您找到密鑰的相同數量的查詢中的密鑰進行過濾。

一個例子:

的車型:

class Order(db.Model): 
    waiter = db.ReferenceProperty(Waiter,required=True) 
    date=db.DateTimeProperty(required=True) 
    delivered=db.BooleanProperty(default=False) 

class Waiter(db.Model): 
    firstname=db.StringProperty(required=True) 
    lastname=db.StringProperty(required=True) 
    uuid=db.StringProperty(required=True) 

web請求功能:

def get(self): 
     waiteruuid=self.request.get("waiter") 
     q=Waiter.all() 
     q.filter('uuid =', waiteruuid) 
     waiterkey=q.get() 
     result={} 
     result['orders']=[] 
     q=Order.all() 
     if waiteruuid: 
      q.filter('waiter =', waiterkey) 
     orders=q.run()