在有序 NDB 查询中包含 None 个值

Including None values in ordered NDB query

我有一个相当简单的 ndb 模型,它已经存在并在数据存储中创建了实例。它看起来像这样:

class ExampleModel(ndb.Model):
    property1 = ndb.StringProperty()
    property2 = ndb.StringProperty()

我想给它添加一个created 属性,这样我就可以按它们创建的时间排序。

class ExampleModel(ndb.Model):
    property1 = ndb.StringProperty()
    property2 = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

当我这样做并尝试查询按 created 排序的实体列表时,它只有 returns 个在更新模型定义后创建的实体。

things = ExampleModel.query().order(ExampleModel.created).fetch()

我尝试将默认值添加到 created,设置为我希望现有实体出现在有序列表中的纪元,但它们仍未包含在该有序查询中。有什么方法可以包含它们,还是我需要迁移现有实体并显式设置它们的 created 属性?

您将无法在新创建的字段上对旧实体进行排序 - 它们不会出现在用于排序的索引中。

您只需根据新模型定义更新现有实体。 在最简单的形式中,您可以只使用 get() 然后立即将您的项目与 .created 属性 添加到模型中。

A​​pp Engine 文档中有一篇有用的文章 - Updating Your Model Schema

如果有大量数据需要更新 - 考虑使用 MapReduce

根据this answer,您似乎不能这样做。

他们建议将字符串 属性 设置为空字符串。在您的情况下,您可以使用一些默认日期值。您的代码必须足够聪明才能去掉这个值。也许是这样的:

class ExampleModel(ndb.Model):
    DEFAULT_CREATED = datetime(2000, 1, 1)
    property1 = ndb.StringProperty()
    property2 = ndb.StringProperty()
    created = ndb.DateTimeProperty(auto_now_add=True)

    def created2(self):
        if self.created == DEFAULT_CREATED:
            return None
        else:
            return self.created

    def created2(self, value):
        if value is None:
            self.created = DEFAULT_CREATED
        else:
            self.value = value

您当然必须将数据存储中的所有空值更新为默认值,但您的客户端代码要简单得多 value = instance.created2()instance.created2(value).