在ProtoRPC.Message中使用数据存储区实体的ID或密钥

时间:2013-05-06 14:01:20

标签: python google-app-engine google-cloud-datastore google-cloud-endpoints

使用ProtoRPC的Message类传输对其他数据存储区实体的引用时,我应该使用str(key)还是key.id()。第一个是String,第二个是long。

到底有什么不同吗?有没有限制?

在过滤查询时,似乎会出现相同的结果。

由于

1 个答案:

答案 0 :(得分:3)

这取决于您的目标是什么,以及您是否使用dbnbd

如果您使用str(key),您将获得一个实体密钥,并且需要构建一个新密钥(在服务器上取决于该值)。使用ndb,我建议使用key.urlsafe()显式,然后ndb.Key(urlsafe=value)创建新密钥。不幸的是,使用db可以做的最好的事情是str(key)db.Key(string_value)

使用key.id()还取决于ndbdb。如果您使用db,您知道此值将是一个整数(并且key.name()将是一个字符串)但如果您使用ndb,则它可以是整数或字符串。在这种情况下,您应该使用key.integer_id()key.string_id()。在任何一种情况下,如果将整数转换为字符串,则需要在检索实体或设置键之前手动转换回整数;例如MyModel.get_by_id(int(value))

如果我要提出推荐,我建议您明确说明您的ID,注意它们的分配方式,并在API中向用户提供这些不透明的值。如果您想让App Engine为您分配ID,请使用protorpc.messages.IntegerField来表示这些ID,而不是强制转换为字符串。

此外,db切换到ndb,如果您还没有。