【问题标题】:How can I fetch the lastest entry of a model new put into NDB?如何获取新放入 NDB 的模型的最新条目?
【发布时间】:2013-03-02 16:49:58
【问题描述】:

如何获取新加入 NDB 的模型的最新条目?

1:如果我使用相同的父键?怎么做?

我看到文档写了

键具有相同根的实体形成一个实体组或组。 如果实体在不同的组中,则更改为这些实体 有时可能会出现“乱序”。如果实体是 与您的应用程序的语义无关,这很好。但如果有些 实体的更改应该是一致的,您的应用程序应该进行 创建它们时它们属于同一组。

这是否意味着,具有相同父键的订单是插入订单?

但是,如何获得最后一个?

2:如果我不使用相同的父键(型号相同)?怎么做?

【问题讨论】:

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


    【解决方案1】:

    如果您对最终一致性没问题(即您可能不会立即看到 非常 最新的),您可以添加一个带有 auto_now_add=True 的 DateTimeProperty,然后运行按该属性排序的查询获取最新的。 (这也是近似值,因为您可能将多个实体保存在一起,它们的顺序与您预期的不同。)

    如果您需要它完全正确,我能看到的唯一方法是创建一个实体,其工作是保存对最新条目的引用,并在与您的条目相同的事务中更新该实体创造。比如:

    class LatestHolder(ndb.Model):
        latest = ndb.KeyProperty('Entry')
    
    # code to update:
    
    @ndb.transactional(xg=True)
    def put_new_entry(entry):
        holder = LatestHolder.get_or_insert(name='fixed-key')
        holder.latest = entry
        holder.put()
        entry.put()
    

    请注意,我在这里使用了一个全局固定的键名,而持有者类没有父级。这是一个瓶颈;如果您的“最新条目”只需要来自特定父级,您可能更愿意创建多个具有不同父级的 LatestHolder 实体,在这种情况下,您只需将父键传递给 get_or_insert。

    【讨论】:

    • 拥有索引的 auto_now_add=True 字段的另一个好处是便于下载数据。我们经常将其用于需要存储在商业智能数据库中的数据。您可以通过很好的控制轻松地随时间传播下载。查询游标管理客户端的排序。讨厌必须为这样的事情专门设置一个索引,但我们喜欢这种设置,并且经常使用它。 HTH。
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多