如何为多个NDB实体更新一个属性?

时间:2015-06-25 12:11:04

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

我有如下NDB模型类:

class Contest(ndb.Model):
    end_date = ndb.DateProperty(required=True, indexed=True)
    ended = ndb.BooleanProperty(required=False, indexed=True)
    ...

我将有一个每日cron作业来标记通过end_date并且ended等于True的竞赛。我编写了以下代码来执行此操作:

contests = Contest.query()
current_datetime = datetime.datetime.utcnow()
today = datetime.date(current_datetime.year, current_datetime.month, current_datetime.day)
contests = contests.filter(Contest.end_date < today)
contests = contests.filter(Contest.ended == False)
contests = contests.fetch(limit=10)
for contest in contests:
    contest.ended = True
ndb.put_multi(contests)

但我不喜欢它,因为我必须阅读所有实体只是为了更新一个值。有没有办法修改它来阅读keys_only

2 个答案:

答案 0 :(得分:1)

  

对象数据会覆盖现有实体。整个对象被发送到数据存储区

https://cloud.google.com/datastore/docs/concepts/entities#Datastore_Updating_an_entity

因此,您不能只发送一个实体的一个字段,它将&#34;删除&#34;所有现有领域。更准确 - 用只有一个字段的新版本实体替换所有字段的实体。

您必须加载要更新的所有实体,包括所有属性,而不仅仅是键,设置属性的新值,然后重新放入数据库。

答案 1 :(得分:1)

我认为Python属性是一个很好的解决方案:

class Contest(ndb.Model):
    end_date = ndb.DateProperty(required=True, indexed=True)

    @property
    def ended(self):
        return self.end_date < date.today()

这样您就不需要更新实体了。无论何时需要,都会自动计算该值。