Python 在有序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

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

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)