【问题标题】:How to do something like a SQL JOIN with appengine如何使用 appengine 执行类似 SQL JOIN 的操作
【发布时间】:2026-01-03 15:30:02
【问题描述】:

我需要一些完全类似于 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 中找不到方法。

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

【问题讨论】:

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


【解决方案1】:

您可以通过父级连接您的 Person 和 Order 模型 - Person 是 Order 的父对象。这样,按顺序遍历 Person 集并选择其顺序就变得简单了。

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

【讨论】:

    【解决方案2】:

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

    不要将Order 与具有共享ID 的User 隐式链接,只需在Order 中引用User

    class User(db.Model):
        # ...
    
    class Order(db.Model):
        distributor = db.ReferenceProperty(User)
        # ...
    
    # e.g.,
    order = Order()
    order.distributor = User()
    

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

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

    【讨论】:

    • 这是一个很好的答案,但我必须将实体与 ID 链接起来,因为 User 对象是 NDB expando 模型。我会尝试寻找其他方法,但这是我能够获得一些可行的解决方案的唯一方法。
    【解决方案3】:

    如果您真的不关心性能并且这是一次性报告类型的工作,您可能希望使用 remote-api。

    【讨论】:

      最近更新 更多