1

我需要一些完全像SQL JOIN的東西,這是無法用appengine完成的,所以我正在尋找解決方法。這是查詢想person.lastname如何做一些像SQL一樣加入appengine

downline = User.query(User.sponsor == distributor.key).fetch() 
for person in downline 
    orders = model.Order.all().filter('distributor_id =' , person.key.id()).filter('created >' , startdate).filter('status =', 'PAID').fetch(999999) 

查詢一個人獲取訂單的地方,基本上我已經用了2類型的實體,個人和訂單的排序。我應該如何去模仿我加入個人(用戶)實體並按人物姓氏對列表進行排序?在SQL中這是一件非常容易的事,我無法在appengine中找到一種方法。

你能告訴我如何在內存中添加人名嗎?該功能不必具有非常好的性能,因爲它是一種報告功能。

+0

可能重複[需要通過引用屬性中的屬性進行排序,任何好的解決方案?](http://stackoverflow.com/questions/3333002/need-to-order-by-properties-in-the-reference -property-any-good-solution) – 2012-02-13 13:59:28

+0

這個問題的答案是在我之前的問題的答案中:http://stackoverflow.com/questions/8929943/modelling-in-google-datastore-use-lists-or-分離實體 – 2012-02-13 14:20:39

回答

1

您可以通過父母關係連接您的人員和訂單模型 - 人員是訂單的父對象。有了它,就可以輕鬆遍歷Person集合並選擇它的順序。

如果您使用NDB將訂單鏈接到您的人員,則使用當前API或重複屬性的另一種方法是使用ListPoperty。

1

請勿使用ID鏈接模型。這是SQL方法;你需要採用noSQL方法。

而不是使用共享ID隱式鏈接OrderUser,而只需參考Order中的User

class User(db.Model): 
    # ... 

class Order(db.Model): 
    distributor = db.ReferenceProperty(User) 
    # ... 

# e.g., 
order = Order() 
order.distributor = User() 

然後抓住你的用戶,通過order()對它們進行排序,然後抓住使用filter()到適當的User所有相關Order秒。

distributors = User.all().filter('sponser = ', sponser).order('lastname').fetch(i) 
for distributor in distributors: 
    orders = Order.all().filter('distributor', distributor).fetch(j) 
    # ... 
+0

這是一個很好的答案,但由於User對象是NDB expando模型,因此我必須將實體與ID鏈接起來。我會盡力尋找其他方法,但這是我能得到一個有點工作的解決方案的唯一方法。 – 2012-03-09 08:09:05

-1

如果你真的不關心性能,這是你可能想看看使用遠程API一次性報告類型的工作。