0

HTTP リクエストを介して 1 つ以上のキー ID (urlsafe キー) の json 配列を取得しています。そして今、私は定義したUserListPropertyにこの ID/ID のキー/キーを保存したいと思います。ndb.KeyPropertyを拡張する、定義された UserProperty を拡張します

したがって、UserPropertyを 1 つのキーだけで使用すると、すべて問題ありません。キーは通常、参照としてデータストアに保存されます。しかし、UserListPropertyを使用すると (キーが 1 つだけでも)、データストアはそれを次のように格納します。[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')]

1 つの Key オブジェクトを含むリストの repr() のように見えますが、これはまさにあなたが望んでいたものです。

残りのコード (リーダー プロパティを定義するモデル クラスなど) の設定方法に何か問題があるのではないでしょうか?

繰り返される 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 に答える