在Ndb数据存储区中,给定实体具有属性num
,该属性应该是唯一ID,但与Ndb的本机ID相反,它不能是一个庞大的数字,但应该被分配等于当前num值的最大值加1。
换句话说,您可以这样指定:
last_entity = MyEntity.query().order(-MyEntity.num).get()
max_num = last_entity.num
new_num = max_num + 1
你想在@transactional范围内这样做,直到你把()新创建的实体放入。
分配num
属性(如果尚未设置)似乎是_pre_put_hook()
中的一个好地方。但我不认为我可以在_pre_put_hook()
函数内开始一个事务,该事务将构成实体的最终put()。
那么如何最好地处理?
另一种方法是定义一个assign_num_and_put()
函数来打开一个事务(比如在父实体上做一个get),然后找到max_num,为新实体分配max_num + 1,然后执行put( ),都在交易中。