如何在 GAE 的 ndb 模型中创建随机默认值?

How to create random default value in ndb model in GAE?

我有一个ndb模型

import os
class ProblemInvite(ndb.Model):
    email = nab.StringProperty(required=True)
    token = ndb.StringProperty(required=True, default=os.urandom(16).encode('hex'))

当我创建模型列表时,标记相同:

import logging
for email in emails:
    problem_invite = ProblemInvite(email=email_address)
    logging.exception(problem_invite.token)

奇怪的是,每封邮件的邀请令牌都是一样的,这是怎么回事?谢谢

数据存储中的 属性 类型一次只能有 一个 个默认值。来自 Property Options table:

所以您的 os.urandom(16).encode('hex') 表达式只计算一次。我不是 100% 确定什么时候,但我怀疑它会在应用程序部署时 - 上传数据存储模型时。

要解决此问题,只需删除默认值并在创建实体时明确指定 属性 值。

旁注: 在 ndb 模型中使用默认值时,您需要格外小心 更改这些默认值 作为行为 (即为受影响的属性返回的数据)可能会更改 应用程序 deployment/update 时数据存储中已经存在的实体。