【问题标题】:NDB SortBy no results for ComputedPropertyNDB SortBy 没有结果为 ComputedProperty
【发布时间】:2016-08-23 09:31:35
【问题描述】:

我对此不是 100% 确定,但在我看来,当使用 sortByComputedProperty 时,NDB 查询会出现问题。 在下面的示例中,按name 排序没有按预期工作,而按numberOfProducts 排序不返回任何条目。但是,如果我按name 排序,则返回numberOfProducts 的正确值,这意味着模型本身和数据库都很好。

我的模特:

class Brand(ndb.Model):
    name = ndb.StringProperty()
    products = ndb.ComputedProperty(lambda self: Product.query(Product.brand==self.key).fetch(keys_only=True))
    numberOfProducts = ndb.ComputedProperty(lambda self: len(self.products))

我的查询:

sortBy = Brand._properties[args['sortBy']]
query = query.order(-sortBy if args['asc'] == '0' else +sortBy)
entities, cursor, more = query.fetch_page(20, start_cursor=Cursor(urlsafe=args['cursor']))

非常感谢任何思考的理由。

【问题讨论】:

  • 我建议您执行一个简单的示例,按计算属性进行查询排序。 (即删除其他可能的变量行为)并查看您是否可以正确排序。还有查询来自哪里。例如Brand.query().order(-Brand.numberOfProducts)
  • 我的错误我没有提到,我完全尝试了你提到的查询,我也没有得到任何实体。我也没有收到任何错误/警告,我只是得到一个空结果。
  • 那么查询是如何定义的?
  • 您何时添加了计算属性,并且您是否使用数据存储查看器检查了该值是否存在于数据存储中?如果稍后添加,并且未执行 put(),则该值将不在索引中。您将看到的是作为 get() 结果计算的值。因此排序不起作用。

标签: python-2.7 google-app-engine google-cloud-datastore app-engine-ndb gcloud


【解决方案1】:

好的,我发现了问题,即使我不知道为什么会导致这种意外行为。 基本上我的computedProperty products 会导致问题:

products = ndb.ComputedProperty(lambda self: Product.query(Product.brand==self.key).fetch(keys_only=True))

此查询返回键的list,因此该属性需要设置repeated 参数。有谁知道这个错误导致我的错误的原因是什么?

【讨论】:

  • 该代码将返回一个键列表。默认情况下,ComputedProperty 不会存储列表。此外,这个计算属性确实效率低下。它总是会在您检索记录时进行评估。我不认为这是你想要的。因此,products 属性的唯一值是在索引中使用它(即伪造连接)。
  • 我完全理解这个错误,但我不明白为什么这会导致我描述的错误。在我的情况下,我想在每次查询品牌时计算这个,因为我想确保我总是得到并更新 productKeys 列表。据我所知,这是最有效的方法吗?
  • 我想如果您“每次”检索您确实想要执行查询的实体,那么它是相当有效的。但是,那么存储键列表是没有意义的。您只想存储 len。此外,您可能会发现使用post_get 挂钩并使用该方法执行查询比存储冗余信息更好。
  • 但是,如果您的代码在单个前端请求中或在几秒钟内(可能长达一分钟)执行的后续查询中多次获取()实体,那么这非常低效。最终一致性的性质是,除非您使用实体组在何处执行查询,否则您无法保证数据是最新的。因此,您可以在短时间内执行大量可能不准确的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2019-05-04
相关资源
最近更新 更多