从Key字符串中删除appid(& namespace)

时间:2011-02-12 12:20:05

标签: google-app-engine

实体密钥的字符串表示始终具有app-id&名称空间作为前缀。但在大多数情况下,它们不是必需的,因为太明显了。

  

离>关键:   ag13YXJjbG91ZC10ZXN0chsLEgVGb3JjZRihnAEMCxIIVW5pdFNsb3QYAgw

     

删除appid_namespace部分后:   chsLEgVGb3JjZRihnAEMCxIIVW5pdFNsb3QYAgw

我知道(种类,身份或姓名)对可以是识别唯一实体的另一种解决方案但是在这里,我只是想知道如何消除app-id&命名空间前缀并将rest作为REST API的一部分公开...

如何删除它们?

1 个答案:

答案 0 :(得分:4)

嘿,我不确定你希望你的REST api如何工作,但如果你做了类似的事情

from google.appengine.ext import db

def getRESTPath (entity):
    def addKeyPathRecursive (key):
        restPaths.append('%s/%s' % (key.kind(), key.id_or_name()))
        parentKey = key.parent()
        if parentKey:
            addKeyPathRecursive(parentKey)
    restPaths = []
    addKeyPathRecursive(entity.key())
    return '/'.join(reversed(restPaths))

class Grandpa(db.Model): pass
class Papa(db.Model): pass
class Kid(db.Model): pass

kid = Kid(parent = Papa(parent = Grandpa().put()).put())
kid.put()
print getRESTPath(kid)

你得到一个像Grandpa/21386/Papa/21387/Kid/21388这样的字符串。

如果你只想要(kind, id_or_name)没有祖先路径,我不确定为什么你对'%s/%s' % (key.kind(), key.id_or_name())不满意。您无法从数据存储区内部处理密钥的方式删除命名空间信息,但这并不意味着您必须将其显示给用户。