member_query = Member.query(Member.account==account)
member_query に Query インスタンスが含まれるようになりました。
そこから、いくつかのオプションがありますが、このクエリから 1 つのエンティティのみを取得する必要があるようです。そうするために、あなたは言うでしょう。
member = Member.query(Member.account==account).get()
これで、アカウントが存在しない場合、 member は None になるか、または Member モデル インスタンスが含まれます。
.fetch() を使用する場合、取得するエンティティの数を最初の引数として指定するか、None (または引数なし) を使用してすべてを取得できます。この条件に一致するエンティティが多数ある場合、これには時間がかかる可能性があります。
もう 1 つのパラダイムは、クエリを反復処理し、条件に一致する最初のエンティティでブレークまたはリターンすることです。このパラダイムにより、クエリ パラメータでカバーされていないオンザフライの条件を実行できます。例えば...
for member in member_query:
if member.active:
return member
# No account
return None
ただし、この種のメンバーシップ モデルに対するクエリは、毎回クエリを実行する必要があるため、理想的とは言えません。もちろん、「ユーザー」が複数の「プロファイル」(例として Facebook ユーザー <-> Facebook ページなど) にアクセスできるようにする場合は、次のようなものが必要です。
次のように、アカウントがアクセスできる「プロファイル」のリストを構造化する方がはるかに効率的です。
class UserAccount(ndb.Model):
"""User Account"""
"""List of keys which reference profiles this user can access"""
profiles = ndb.KeyProperty(repeated=True)
def fetch_profiles(self):
"""Returns a list of profile entities this user can access"""
return ndb.get_multi(profiles)
def can_user_access_profile(self, profile):
"""Returns True if user can access 'profile' (either a ndb.Model or ndb.Key)"""
if isinstance(profile, ndb.Model):
profile = profile.key() # Convert Model instances to a key
return profile in self.profiles
class Profile(ndb.Model):
# ...
ご覧のとおり、これにより、ユーザーが特定のプロファイルにアクセスできるかどうかをすばやく判断することもできます。