我需要在Google数据存储中强制执行类的唯一性。以下是我如何强制执行唯一性
from google.appengine.ext import ndb
from webapp2_extras.appengine.auth.models import Unique
class UserTag(ndb.Model)):
user_key = ndb.KeyProperty(kind='User', required=True)
name = ndb.StringProperty()
def _pre_put_hook(self):
super(UserTag, self)._pre_put_hook()
success = Unique.create(self.user_key)
if not success:
raise Exception('Cannot create unique key: %s' % unique_key)
这种方法正常,直到我想在UserTag
命名空间中保留archive
版本,只要修改了UserTag
的实例。
cloned_user_tag = UserTag(user_key=orig.user_key, name=orig.name, namespace='archive')
cloned_user_tag.put(cloned_user_tag) # throw exception
然后会抛出异常
Exception: Cannot create unique key: UserTag:123
避免此问题的最佳方法是什么?暂停执行唯一性的最佳方法是什么?如果命名空间为Unique.create
,我可以跳过archive
,但
1)我怎么知道当前的命名空间
2)是否有更好的解决方案
答案 0 :(得分:0)
我相信您可以检查_pre_put_hook()
内的命名空间,如下所示:
def _pre_put_hook(self):
super(UserTag, self)._pre_put_hook()
if self._key.namespace() != 'archive':
success = Unique.create(self.user_key)
if not success:
raise Exception('Cannot create unique key: %s' % unique_key)