4

在此页面中:https ://developers.google.com/appengine/docs/python/datastore/keyclass#Key_from_path

这部分:

Key.from_path(kind, id_or_name, parent=none, namespace=None, **kwds) 从一个或多个实体键的祖先路径构建一个新的 Key 对象。

路径表示实体的父子关系层次结构。路径中的每个实体都表示实体的种类,以及它的数字 ID 或它的键名。完整路径表示路径中最后出现的实体,其祖先(父母)作为前面的实体。

例如,以下调用为类型为 Address 且数字 ID 为 9876 的实体创建一个键,其父对象是类型为 User 的实体,其命名键为“Boris”:

k = Key.from_path('用户', '鲍里斯', '地址', 9876)

有关路径的更多信息,请参阅键和实体组。

函数调用和解释在这里没有意义,如果 Address 是“kind”参数,它应该先行吗?ID 9876 应该排在第二位吗?为什么他们是第三和第四?
而“父”是第三个参数,为什么这里有两个“父”参数(种类“用户”和名称“鲍里斯”),它们在参数列表中是第一个和第二个?

4

2 回答 2

2

AppEngine 中的密钥是分层的,要获得完整的密钥,您需要传递所有祖先信息。

在本例中,有两种对象类型:用户和地址,用户是地址的父对象。对 from_path 的调用首先提供对象类型 User,其 id 为 Boris(id 可以是字符串名称或整数 id),该对象有一个 Address 类型的子对象,其 id 为 9876。

于 2012-05-20T13:45:58.483 回答
2

Gae 源码from_path来看,该类的静态方法的签名Key是:

def from_path(*args, **kwds):

接受非零偶数个位置参数,形式为(kind, id or name, kind, id or name, etc. etc.)

if not args or len(args) % 2:
  raise datastore_errors.BadArgumentError(
      'A non-zero even number of positional arguments is required '
      '(kind, id or name, kind, id or name, ...); received %s' % repr(args))

如文档中所述,完整路径表示路径中最后出现的实体,其祖先(父母)作为前面的实体。

所以这个例子似乎是正确的;创建的密钥是地址类型为9876的实体的密钥,其父类型为用户,用户类型为 'Boris' 。idkey name

于 2012-05-20T14:18:19.830 回答