【问题标题】:NDB Query with Computed Property returns a blank list具有计算属性的 NDB 查询返回一个空白列表
【发布时间】:2013-03-08 20:40:49
【问题描述】:

我正在尝试使用计算属性查询 ndb 模型,但它返回一个空列表。 This answer 建议我应该能够查询计算属性,the docs 也是如此。我做错了什么?

from django.template import defaultfilters
class Video(models.SfxModel):

  title = ndb.StringProperty()
  slug = ndb.ComputedProperty(
    lambda self: str(defaultfilters.slugify(self.title)) )

在交互式控制台中

from app.lib.videos import Video

slug = Video.query().get().slug
print slug
# => "some-dasherized-string"
print Video.query(Video.slug == slug).fetch()
# => []

【问题讨论】:

    标签: django google-app-engine


    【解决方案1】:

    您遇到的“问题”是为非ancestor queries 提供的eventual consistency
    您所看到的对于高复制数据存储来说是完全正常的。 当您放置一个实体并在它之后立即查询它时,可能是它没有复制到所有数据中心,因此无法找到它。

    如果你想让它工作,你必须通过将父级添加到实体来使用实体组。 这可以是实体键或不属于任何存储实体的构造键。

    这行得通:

    class Video(ndb.Model):
        title = ndb.StringProperty()
        slug  = ndb.ComputedProperty(lambda self: self.title.replace(' ', '-'))
    
    v = Video(parent = ndb.Key(Video, 'xxx'), title = 'foo bar') 
    v.put()
    
    print Video.query(Video.slug == v.slug, ancestor = ndb.Key(Video, 'xxx')).get()
    

    【讨论】:

    • 我有点困惑为什么实体组很重要。为什么我要将视频声明为我的视频实体的父级?如果我这样做了,哪个实体将是父母?在您的示例代码中,"xxx" 是占位符还是意味着什么?感谢您及时的回复。另外,我上面显示的代码在dev_appserver 中。这有什么改变吗?
    • 这就是数据存储与实体组和最终一致性的工作方式。父级只是一个生成的密钥。应该看看我指向你的文档。如果您保存一个实体并在它之后立即查询它,则不能保证它立即被非祖先查询返回。 SDK 旨在反映生产环境,因此您也应该在生产环境中期待这一点。但它可能会在 1 秒后...看看这里developers.google.com/appengine/docs/python/datastore/…
    • 但这并不意味着您根本需要使用祖先。如果您不需要在创建后立即查询该特定实体,那么您将可以很好地处理最终的一致性。
    • >> 父级只是一个生成的密钥。对不起,我仍然不明白这一点。我知道要使实体立即可用,我应该将其添加到实体组中,但这是祖先的唯一目的吗?另外,我的示例显示了一个新添加的property(与新添加的实体相反。我假设新属性也遵循相同的最终一致性原则?
    • stackoverflow.com/questions/2002887/… 这可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多