在有序 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 属性 添加到模型中。
App 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)
.
我有一个相当简单的 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 属性 添加到模型中。
App 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)
.