3

Google App Engine の NDB でエンティティを取得するには、後で行う必要がありfetch()ますquery()か? 例えば:

account = self.request.get('account')
member = Member.query(Member.account==account).fetch()
if member:   
    # Account exists
else:        
    # Account does not exist

2 つの質問があります。

  1. .fetch()を使用すると、コードは正しく実行されます。ただし、 .fetch()を使用しない場合、テストは常に true になります。これは、一部のエンティティが取得されることを意味します。何が問題ですか?
  2. 一般に、クエリの後にすべてのエンティティ.fetch()を取得したい場合 、使用する必要がありますか?
4

3 に答える 3

6

fetch()が使用されていない場合はmember = Member.query(..)、Query クラスのインスタンスを に割り当てますmember。だからあなたのif条件は真です。

于 2013-03-14T13:47:10.340 に答える
4
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):
    # ...

ご覧のとおり、これにより、ユーザーが特定のプロファイルにアクセスできるかどうかをすばやく判断することもできます。

于 2013-11-15T02:00:08.470 に答える
2

member = Member.query(Member.account==account).get()1 つのインスタンスを取得することを意味します。

members = Member.query(Member.account==account).fetch()結果をリストで返します。

memberQuery = Member.query(Member.account==account)再度フィルタリングできる Query クラスを返します。

于 2014-04-06T12:46:59.100 に答える