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一次性报告类型的工作。