【问题标题】:AppEngine Python NDB Type Error on .order().order() 上的 AppEngine Python NDB 类型错误
【发布时间】:2016-06-24 20:13:30
【问题描述】:
@property
def returns_an_int(self):
some_var = do_something_that_returns_int()
if some_var:
return int(some_var)
else:
return 0
我有一个使用上面代码的属性,它应该(并且确实)返回一个 int。 (我将 int 强制转换为仔细检查)但是当我尝试使用它来订购 fetch 时,cls.query().order(cls.returns_an_int) 我收到一个类型错误TypeError: order() expects a Property or query Order; received <property object at 0xsome-hex-address> - 我尝试使用 + 或 - 看看我是否可以做到得到一个值,因为我在其他问题中看到了它,但它没有用。我究竟做错了什么?我是否缺少使其工作的基本内容?
【问题讨论】:
标签:
python
google-app-engine
google-cloud-datastore
models
app-engine-ndb
【解决方案1】:
当您查询数据存储时,您需要查询各种ndb.Property types 之一。您正在查询 vanilla 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 方法。如果它是一种快速执行的方法,那应该不是问题,但如果它是一种慢速方法,您可能会开始注意到差异。