Python 在有序NDB查询中不包含任何值
我有一个相当简单的ndb模型,它已经存在,并且在数据存储中创建了实例。它看起来像这样:Python 在有序NDB查询中不包含任何值,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,我有一个相当简单的ndb模型,它已经存在,并且在数据存储中创建了实例。它看起来像这样: class ExampleModel(ndb.Model): property1 = ndb.StringProperty() property2 = ndb.StringProperty() class ExampleModel(ndb.Model): DEFAULT_CREATED = datetime(2000, 1, 1) property1 = ndb.String
class ExampleModel(ndb.Model):
property1 = ndb.StringProperty()
property2 = ndb.StringProperty()
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
我想向它添加一个created
属性,这样我就可以按创建时间对它们进行排序
class ExampleModel(ndb.Model):
property1 = ndb.StringProperty()
property2 = ndb.StringProperty()
created = ndb.DateTimeProperty(auto_now_add=True)
当我执行此操作,并尝试查询由创建的
排序的实体列表时,它只返回更新模型定义后创建的实体
things = ExampleModel.query().order(ExampleModel.created).fetch()
我已尝试将默认值添加到创建的
,
,设置为我希望现有实体位于有序列表中的历元,但它们仍然不包括在该有序查询中。是否有任何方法包括它们,或者我是否需要迁移现有实体并显式设置它们的created
属性?您将无法对新创建的字段上的旧实体进行排序。它们将不会出现在用于排序的索引中
您所需要的只是根据新的模型定义更新现有实体。
在最简单的形式中,您只需获取()并立即将()您的项与.created属性一起添加到模型中
appengine文档中有一篇有用的文章-
在有大量数据需要更新的情况下,考虑使用.< /P> < P>,看来你不能这样做。 他们建议将字符串属性设置为空字符串。在您的情况下,可以使用一些默认的日期值。您的代码必须足够智能,才能去掉此值。也许是这样的:
class ExampleModel(ndb.Model):
property1 = ndb.StringProperty()
property2 = ndb.StringProperty()
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)