【问题标题】:Including None values in ordered NDB query在有序 NDB 查询中包括 None 值
【发布时间】:2015-10-02 18:52:12
【问题描述】:

我有一个已经存在的相当简单的 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 排序的实体列表时,它只返回更新模型定义后创建的实体。

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

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

【问题讨论】:

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


    【解决方案1】:

    基于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)

    【讨论】:

      【解决方案2】:

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

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

      App Engine 文档中有一篇有用的文章 - Updating Your Model Schema

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 2015-04-14
        • 1970-01-01
        • 2014-11-14
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多