我有如下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
?
答案 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()
这样您就不需要更新实体了。无论何时需要,都会自动计算该值。