Python 如何为所有NDB数据存储条目分配默认值?

Python 如何为所有NDB数据存储条目分配默认值?,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我必须向现有NDB类添加一个新属性: class AppList(ndb.Model): ... ignore = ndb.BooleanProperty(default=False) # new property 然后我将使用它,如下所示: entries = AppList.query() entries = entries.filter(AppList.counter > 5) entries = entries.filter(AppList.ignore == F

我必须向现有NDB类添加一个新属性:

class AppList(ndb.Model):
    ...
    ignore = ndb.BooleanProperty(default=False) # new property
然后我将使用它,如下所示:

entries = AppList.query()
entries = entries.filter(AppList.counter > 5)
entries = entries.filter(AppList.ignore == False)
entries = entries.fetch()
我无法使用
AppList.ignore!=True
以捕获早期添加的记录(不具有
ignore
属性),因此我必须为我的
AppList
实体中的所有记录分配
False
。最有效的方法是什么?目前,该实体包含大约4000个条目

Upd。我决定使用以下难看的代码(没有成功应用
游标
),它作为cron作业运行。但我不是每次都更新同样的100条记录吗

entities = AppList.query()
# entities = entities.filter(AppList.ignore != False)
entities = entities.fetch(100)
while entities:
    for entity in entities:
        entity.ignore = False
        entity.put()
    entities = AppList.query()
    # entities = entities.filter(AppList.ignore != False)
    entities = entities.fetch(100)

您可以尝试使用hasattr检查记录是否具有ignore属性

如果只想为AppList实体中的所有记录分配False,则只需更新模式(重新加载models.py文件),然后就可以将属性设置为False

可以找到有关架构更新的更多信息

编辑: 要回答您的评论:

if hasattr(entity, 'ignore'):
  #your code goes here

在不部署新代码的情况下,最简单的方法是使用远程api,执行一个查询,获取所有实体,并将属性值设置为false,然后将其放入()。4000张唱片并不多


事实上,您甚至不需要显式设置该值,如果当前没有值,则在检索到默认值时将其设置。

您更新的代码将仅更新前100个实体。尝试使用游标

如果不能使用游标,则使用偏移量,并在每个循环上将偏移量增加100,或者通过fetch()一次获取所有条目(游标方法更好)

而不是一个接一个地使用它们 ndb.put\U multi(要放置的实体列表)


这将比逐个放置快得多

不要忘记,在这些情况下会使用MapReduce库。但我认为最好的方法是把所有这些建议结合起来

现在,您需要get()和put()4000个实体,问题是如何降低此操作的“成本”

我只是想知道你的
bool(entity.ignore)
返回了什么。如果
缺失
属性返回False,您可以调整代码,将其视为False并推迟操作。如果出于其他原因放置(),由于默认参数,属性
ignore
将写入
False
。因此,对于其他实体,可以运行这样的脚本(通过远程api):


如何将
hasattr
fetch
一起使用?请参阅我更新的问题-主要问题是如何获取没有此属性的实体。不幸的是,看起来我必须设置值-请参阅我的问题,如果我使用
query
,则它不会“应用”默认值。哦,这只是在结果集上的一个简单for循环,设置值并放置。谢谢。我曾尝试使用
游标
,但我不明白当我称之为第二次/第三次等时,应该是什么
开始游标
值。每次使用游标进行查询时,您都会得到一组数据和一个游标,直到您到达数据的末尾并且没有游标为止(或者游标没有,我忘记了是哪个)。谢谢。请您澄清以下行的作用:
put_queue=[ent for ent in res if not hasattr(ent,'ignore')]
?如果条目没有'ignore'属性,那么会发生什么?答案已编辑:ndb.get_multi()需要一个实体列表。该行创建一个列表,其中仅包含不具有“忽略”属性的实体。它对4个新行也有同样的作用。我理解正确吗?您的代码实际上没有将默认值
False
分配给
ignore
属性?也就是说,在
put\u queue.append(ent)
?put()或put\u multi()之前,缺少一行
ent.ignore=False
。如果模型中没有默认参数,就需要这一行。那就奇怪了。因为我已经在我的数据库上运行了你的代码,但它没有用这个缺少的值更新条目。。。是的,我在模型中有
default=False
参数。
def iter_entities(cursor=None):
    entries = AppList.query()
    res, cur, more = entries.fetch_page(100, start_cursor=cursor)
    put_queue = [ent for ent in res if not hasattr(ent, 'ignore')]
    # put_queue = []
    # for ent in res:
    #    if not hasattr(ent, 'ignore'):
    #        put_queue.append(ent)
    ndb.put_multi(put_queue)
    if more:
        iter_entities(cur) # a taskqueue is better