如何在 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 时数据存储中已经存在的实体。
我有一个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 时数据存储中已经存在的实体。