0

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

因此,如果我只用一个键使用UserProperty .. 一切都好。密钥通常存储在数据存储中并作为参考。但是当我使用UserListProperty(即使只有一个键)时,数据存储将其存储为:[datastore_types.Key.from_path(u'Example', 20L, u'User', 21L, _app=example~db')]

我在哪里存储这个密钥?它位于另一个具有 UserListProperty 的模型实例 List 的属性(读取器)中。

好的,所以我认为我必须在 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.'

for viewer in viewerlist:
    key = Key(urlsafe=viewer)
    if not key in list.reader:
        list.reader.append(key)

希望有人可以帮助我.. 我读了一些关于 db.ReferenceProperty 并试图把它放在这里(而不是 KeyProperty)。但它不起作用。也许我做错了什么。或者它只是没有帮助。

4

1 回答 1

1

您的代码实际上可能正常工作。您看到的字符串:

[datastore_types.Key.from_path(u'Example', 20L, u'User', 21L, _app=example~db')]

看起来像包含一个 Key 对象的列表的 repr() ,这正是您想要的。

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

要访问重复的 KeyProperty 引用的实体(这就是您正在做的事情),您必须使用循环,例如

for k in list.reader:
    ex = k.get()
    ...use ex...

PS。我不会像你那样在你的init中设置 self._repeated ;我会将它传递给超级调用,如下所示:

super(UserListProperty, self).__init__(*args, repeated=True, **kwargs)

什么是_visible?如果您不需要它,也许不用定义 KeyProperty 的琐碎子类,只需使用以下命令:

reader = KeyProperty(Example, repeated=True)

PS。关于 ReferenceProperty,它来自旧的 db 模块,最好忘记。

于 2013-06-20T16:27:03.820 回答