Python,ndb:datastore中的键是这样存储的[datastore_types.Key.from_path(…)]

Python,ndb:datastore中的键是这样存储的[datastore_types.Key.from_path(…)],python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我通过HTTP请求获得一个包含一个或多个密钥ID(urlsafe密钥)的json数组。现在我想把这个Id/Id的键存储在我定义的UserListProperty中。它扩展了我定义的UserPropertyto,它扩展了ndb.KeyProperty 因此,如果我只使用一个键使用UserProperty。。一切都好。密钥通常存储在数据存储中并作为引用。但是当我使用UserListProperty(即使只有一个键),数据存储将其存储为:[datastore\u types.key.from\u pa

我通过HTTP请求获得一个包含一个或多个密钥ID(urlsafe密钥)的json数组。现在我想把这个Id/Id的键存储在我定义的UserListProperty中。它扩展了我定义的UserPropertyto,它扩展了ndb.KeyProperty

因此,如果我只使用一个键使用UserProperty。。一切都好。密钥通常存储在数据存储中并作为引用。但是当我使用UserListProperty(即使只有一个键),数据存储将其存储为:
[datastore\u types.key.from\u path(u'Example',20L,u'User',21L,_app=Example~db')]

这把钥匙存放在哪里?它位于另一个具有UserListProperty的模型实例列表的属性(读取器)中

好的,我想我必须在UserListProperty定义中或者在写入这个属性的方式中做一些错误的事情。我想展示两个:

class UserProperty(ndb.KeyProperty):
    def __init__(self, *args, **kwargs):
        super(UserProperty, self).__init__(*args, **kwargs)
        self._visible = False
        self._verbose_name = 'User key'


class UserListProperty(UserProperty):
    def __init__(self, *args, **kwargs):
        super(UserListProperty, self).__init__(*args, **kwargs)
        self._repeated = True
        self._visible = False
        self._verbose_name = 'List containing user keys.'


希望有人能帮助我。。我读了一些关于db.ReferenceProperty的内容,并尝试将其放在这里(而不是KeyProperty)。但它不起作用。也许我做错了什么。或者根本没用。

你的代码可能真的能正常工作。您看到的字符串:

[datastore_types.Key.from_path(u'Example', 20L, u'User', 21L, _app=example~db')]
看起来像是包含一个键对象的列表的repr(),这正是您想要的

您设置其余代码的方式可能有问题(例如,定义reader属性的模型类)

要访问重复的KeyProperty引用的实体(您正在执行的操作),必须使用循环,例如

for k in list.reader:
    ex = k.get()
    ...use ex...
注:我不会像你那样在你的初始化中重复;我会将其传递给超级呼叫,如下所示:

super(UserListProperty, self).__init__(*args, repeated=True, **kwargs)
什么是可见的?如果您不需要它,也许不需要定义KeyProperty的普通子类,只需使用以下命令:

reader = KeyProperty(Example, repeated=True)

另外,关于ReferenceProperty,它来自旧的db模块,最好不要忘记。

我不明白您认为它存储密钥的方式有什么问题。对我来说,它看起来绝对好。你在期待什么?(为什么要创建这些属性子类?它们似乎毫无意义,您可以直接在字段定义上设置属性。)好的。。很高兴听到,问题不在这里。当我在本地测试时,一切都正常。。应该怎样。但是在直播系统上。。没有。它存储一个新列表。。但它不存储属性读取器。所以我得去别的地方找。。谢谢你的评论。所以我对关键的事情并不绝望。。但是在别的地方;)我想我必须期望密钥的显示方式与userProperty的显示方式类似:agtkZXZ-bG9mdGlkYnIXCxIETG9mdBgUDAsSB0FjY291bnQYFQw示例:id=20>User:id=21,而不是像这样的符号:[datastore_types.key.from_path(u'Example',20L,u'User',21L,_appexample~db')],但是如果这是正确的话。。因为这是一张钥匙清单。所以谢谢你这么快的回答!事情是。。它写入属性中。。但不能把它们当作钥匙来读。也许是我读错了。但因为它在本地工作,我想知道为什么它不能在现场工作。
reader = KeyProperty(Example, repeated=True)