私は別のユーザーであるスポンサーのキーを使用して、ユーザーのスポンサーが誰であるかを示します。これにより、スポンサーを持つユーザーのデータストアにリンクが作成されます。これは最大で1つですが、スポンサーは次のような多くのユーザーをスポンサーできます。この場合、他の3人のユーザーを後援したID2002:
この場合、このクエリは私が望むことを実行します:SELECT * FROM User where sponsor =KEY('agtzfmJuYW5vLXd3d3ILCxIEVXNlchjSDww')
しかし、Pythonでそれをプログラムする方法がわからないので、データストアに対してのみ使用できます。同じフィールドのキーと同じユーザーを持つユーザーのセットを照合する場合、キーでクエリするにはどうすればよいですか?私のモデルのユーザーは最大で1人のスポンサーを持つことができ、特定の人が誰をスポンサーしているかを知りたいだけです。これはユーザーのリストであり、次に彼らが順番にユーザーをスポンサーしていて、それについても質問したいと思います。
フィールドスポンサーはキーであり、データストア内のスポンサーへのリンクがあります。user2.sponsor = user1.keyのようにキーを設定しました。次に、次のようなクエリでスポンサーされているuser1をすべて検索します。
User.All().filter('sponsor = ', user1.key)
しかし、スポンサーはタイプキーのフィールドであるため、たとえば、アクティブユーザーがスポンサーである人々のリストを確認するためにそれを照合する方法や、第2世代にもリンクがある場合にツリーになる方法がわかりません。このユーザーがスポンサーであり、次に第2世代であるユーザーのリストを選択するにはどうすればよいですか?関係を単純にu1=u2.key、つまりuser2.sponsor=user1.keyのようにモデル化したとき。ヒントをありがとう
次の回避策は悪い習慣ですが、私の最後で唯一の手段です。
def get(self):
auser = self.auth.get_user_by_session()
realuser = auth_models.User.get_by_id(long( auser['user_id'] ))
q = auth_models.User.query()
people = []
for p in q:
try:
if p.sponsor == realuser.key:
people.append(p)
except Exception, e:
pass
if auser:
self.render_jinja('my_organization.html', people=people, user=realuser,)
アップデート
問題は、キープロパティが不要であり、コードのバグだと思うときに、GuidoVanRossumがこれをndbのバグとして報告していることです。これが私が現在使用しているものです。これは、プログラマー、テスター、管理者を除く組織内のすべての実際のユーザーがユーザーIDであるスポンサーIDを持っている必要があるため、非常に受け入れられるソリューションです。
from ndb import query
class Myorg(NewBaseHandler):
@user_required
def get(self):
user = auth_models.User.get_by_id(long(self.auth.get_user_by_session()['user_id']))
people = auth_models.User.query(auth_models.User.sponsor == user.key).fetch()
self.render_jinja('my_organization.html', people=people,
user=user)
class User(model.Expando):
"""Stores user authentication credentials or authorization ids."""
#: The model used to ensure uniqueness.
unique_model = Unique
#: The model used to store tokens.
token_model = UserToken
sponsor = KeyProperty()
created = model.DateTimeProperty(auto_now_add=True)
updated = model.DateTimeProperty(auto_now=True)
# ID for third party authentication, e.g. 'google:username'. UNIQUE.
auth_ids = model.StringProperty(repeated=True)
# Hashed password. Not required because third party authentication
# doesn't use password.
password = model.StringProperty()
...