15

ReferenceProperty は、2 つのモジュール間の参照を処理するのに非常に役立ちました。キツネの例:

class UserProf(db.Model):
    name = db.StringProperty(required=True)

class Team(db.Model):
    manager_name = db.ReferenceProperty(UserProf, collection_name='teams')
    name = db.StringProperty(required=True)
  • チーム インスタンスで「manager_name」を取得するには、team_ins.manager_name を使用します。
  • 特定のユーザー インスタンスによって管理される「チーム」を取得するには、user_instance.teams を使用して反復します。

簡単で分かりやすいと思いませんか?

NDB を使用して同じことを行うには、変更する必要があります

db.ReferenceProperty(UserProf, collection_name='teams')-->ndb.KeyProperty(kind=UserProf)

  • team_ins.manager_name.get()マネージャーの名前を教えてくれます
  • 特定のユーザーによって管理されているすべてのチームを取得するには、次のことを行う必要があります

    for team in Team.query(Team.manager_name == user_ins.key): 
        print "team  name:", team.name
    

ご覧のとおり、この種のシナリオの処理は、ndb よりも db の方が簡単で読みやすいように見えます。

  • ndb で ReferenceProperty を削除する理由は何ですか?
  • db のクエリ user_instance.teams でさえ、ndb の for ループで行われるのと同じことを行う必要があります。しかし、ndb では、for ループの使用について明示的に言及しています。
  • user_instance.teams を実行するとき、舞台裏で何が起こっているのでしょうか?

前もって感謝します..

4

2 に答える 2

7

Guido が参照プロパティを実装しなかった理由についての答えはわかりません。

ただし、pre_fetch_refprops http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engineを使用して多くの時間を費やしていることがわかりました (get_value_for_datastore ですべてのキーを取得して、すべての参照プロパティをプリフェッチします。 ) そして、キーに対して get_multi を実行します。

これははるかに効率的でした。

また、参照されたオブジェクトが存在しない場合、オブジェクトをフェッチしようとするとエラーが発生します。

参照を持つオブジェクトをピクルすると、おそらく計画したよりも多くのピクルを使用することになります。

したがって、単一のエンティティがあり、参照されたオブジェクトを .name 型アクセサーで取得したいという 1 つのケースを除いて、参照されたエンティティがフェッチされないようにするためにあらゆる種類のフープをジャンプする必要があることがわかりました。

于 2013-05-29T07:08:58.523 に答える