1

我正在尝试在 appengine 中使用 ndb 执行查询,如下所示

all_adverts = AdModel.query(AdModel.daily_used < AdModel.daily_budget)

我正在尝试仅查询未使用其广告活动预算的每日最大值的项目。但是,当我运行它时,我得到以下异常:

BadValueError: Expected float, got FloatProperty('daily_budget', default=1)

ndb 根本不可能做到这一点,还是我错误地构造了查询?

4

3 回答 3

2

您的查询需要扫描所有相同类型,这不是数据存储的典型用法。

一个更简单的解决方法是使用ComputedProperty。然后使用此属性进行过滤。当然,此更改只会影响以后的实体更新。

class AdvertModel(ndb.Model):
    daily_used = ndb.FloatProperty()
    daily_budget = ndb.FloatProperty()
    in_money = ndb.ComputedProperty(lambda self: self.daily_used < self.daily_budget)
于 2013-04-22T17:16:51.817 回答
0

您需要了解查询机制需要比较右侧的值,而不是另一个属性。它不是 ndb 的限制,而是底层架构的工作方式。因此你得到的错误BadValueError: Expected float, got FloatProperty('daily_budget', default=1)。其他答案是您对所需功能的最佳选择。

于 2013-04-22T23:17:05.293 回答
0

您的设置将需要使用自定义(复合)索引。这增加了资源。为什么不添加一个布尔字段“daily_under_budget”。每次更新 daily_used 或 daily_budget 时,您都可以设置此值。然后,您不需要自定义索引。

于 2013-04-22T22:34:10.880 回答