我创建了一个ndb.KeyProperty
的子类,它可以接受键,但也可以接受实体或base 64键字符串并将它们转换为键。除非我尝试创建repeated
属性,否则它的效果很好。
基本上我的代码是这样的:
def to_key(target):
if isinstance(target, ndb.Model):
target_key = target.key
elif isinstance(target, ndb.Key):
target_key = target
else:
try:
target_key = ndb.Key(urlsafe=target)
except:
raise TypeError('%s is not an ndb instance or key' % target)
return target_key
class AutoKeyProperty(ndb.KeyProperty):
def _validate(self, value):
return to_key(value)
处理_validate
中的可迭代值只会将问题移至基础ndb.KeyProperty
类。
答案 0 :(得分:0)
您需要覆盖的正确功能是_to_base_type
。此函数将输入值转换为属性类型的实例,在您的情况下为Key。所以你的AutoKeyProperty
课程看起来像这样:
class AutoKeyProperty(ndb.KeyProperty):
def _to_base_type(self, value):
return to_key(value)