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

时间:2016-06-24 20:13:30

标签: python google-app-engine google-cloud-datastore models app-engine-ndb

@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 cast以进行仔细检查)但是当我尝试使用它来命令获取时,cls.query().order(cls.returns_an_int)我收到类型错误TypeError: order() expects a Property or query Order; received <property object at 0xsome-hex-address> - 我尝试使用+或 - 来查看是否我可以让它获得一个价值,因为我在其他问题中看到它,但它没有用。我究竟做错了什么?我错过了一些基本的东西让它起作用吗?

1 个答案:

答案 0 :(得分:3)

查询数据存储区时,需要查询其中一个ndb.Property types。你在查询香草蟒蛇属性。这不起作用,因为python属性数据永远不会存储在数据存储区中,因此数据存储区无法通过它不知道的数据进行排序。

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

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

但这对于拥有 lot 实体的实体类型不起作用。您还可以将您的媒体资源更改为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方法。如果它是一种快速的执行方法,那应该不是问题,但如果它是一种缓慢的方法,你可能会开始注意到差异。