如何使用appengine执行类似SQL JOIN的操作

时间:2012-02-13 13:54:42

标签: python google-app-engine google-cloud-datastore python-2.7

我需要的东西与SQL JOIN完全不同,因为我无法使用appengine,所以我正在寻找一种解决方法。这是要按person.lastname

排序的查询
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)

查询获取一个人的订单位置,基本上我有两种实体,人员和订单。我应该如何模仿我加入人(用户)实体并按人的姓氏对列表进行排序?这在SQL中很容易做到,我无法在appengine中找到方法。

你能告诉我如何在内存中添加人名吗?该函数不一定具有非常好的性能,因为它是一个报告函数。

3 个答案:

答案 0 :(得分:1)

不要使用ID链接模型。那就是SQL方法;你需要采用noSQL方法。

不是将Order与带有共享ID的User隐式关联,而只需引用User中的Order

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

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

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

然后抓住您的用户,按order()对其进行排序,然后使用Order针对相应的filter()抓取所有关联的User

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

答案 1 :(得分:1)

您可以通过育儿来连接您的人员和订单模型 - 人是订单的父对象。这样,按顺序遍历Person集并选择其顺序变得很简单。

另一种方法是使用ListPoperty,如果您使用当前API或重复属性,如果您使用NDB将订单链接到您的人员。

答案 2 :(得分:-1)

如果你真的不关心性能,这是一次性报告类型的工作,你可能想看看使用remote-api。