AppEngine Python .order() 上的 NDB 类型错误

AppEngine Python NDB Type Error on .order()

@property
def returns_an_int(self):
    some_var = do_something_that_returns_int()
    if some_var:
        return int(some_var)
    else:
        return 0

我有一个使用上面代码的 属性,它应该(并且确实)return 一个 int。 (我将 int 强制转换为双重检查)但是,当我尝试使用它来订购提取时,cls.query().order(cls.returns_an_int) 我收到类型错误 TypeError: order() expects a Property or query Order; received <property object at 0xsome-hex-address> - 我尝试使用 + 或 - 来查看是否我可以让它得到一个值,因为我在其他问题中看到它但是没有用。我究竟做错了什么?我是否缺少使其正常工作的基本要素?

当您查询数据存储时,您需要查询各种 ndb.Property types 之一。您正在查询香草 python 属性。这不起作用,因为 python 属性 数据永远不会存储在数据存储中,因此数据存储无法按它不知道的数据排序。

很难就如何解决这个问题给出明确的建议。您可以在没有 .order 的情况下进行查询,并在客户端代码中排序:

return sorted(cls.query(), key=lambda item: item.returns_an_int)

但这不适用于具有 很多 个实体的实体类型。您还可以将 属性 更改为 ndb.ComputedProperty:

@ndb.ComputedProperty
def returns_an_int(self):
    some_var = do_something_that_returns_int()
    if some_var:
        return int(some_var)
    else:
        return 0

这里的缺点是您要存储(并支付)更多的数据存储数据,并且还要为每个数据存储执行 returns_an_int 方法。如果它是一种快速执行的方法,那应该不是问题,但如果它是一种缓慢的方法,您可能会开始注意到其中的差异。