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
方法。如果它是一种快速执行的方法,那应该不是问题,但如果它是一种缓慢的方法,您可能会开始注意到其中的差异。
@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
方法。如果它是一种快速执行的方法,那应该不是问题,但如果它是一种缓慢的方法,您可能会开始注意到其中的差异。