Google App Engine NDB:需要在查询后获取()吗?

时间:2013-03-14 13:27:30

标签: google-app-engine app-engine-ndb

要在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

我有两个问题:

  1. 如果使用.fetch(),代码将正确运行。但是,如果 没有使用.fetch(),测试总是正确的,这意味着一些 检索实体。有什么问题?
  2. 一般来说,如果我想要检索,是否需要使用.fetch() 查询后所有实体?

3 个答案:

答案 0 :(得分:6)

如果未使用fetch(),则member = Member.query(..)会将Query类实例分配给member。所以你的if条件是真的。

答案 1 :(得分:4)

member_query = Member.query(Member.account==account)

member_query现在包含一个Query实例。

从那里,您有几个选项,但似乎您只想从此查询中获取一个实体。要做到这一点,你会说。

member = Member.query(Member.account==account).get()

现在,如果帐户不存在,则成员为None,或者包含成员模型实例。

如果使用.fetch(),则可以指定要作为第一个参数检索的实体数,或使用None(或无参数)来获取所有实体。如果有很多实体符合这个条件,这可能会非常耗时。

另一种范例是迭代查询并中断或返回符合条件的第一个实体。这种范例允许您执行查询参数未涵盖的即时条件。例如......

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):
    # ...

如您所见,这也让您可以快速确定用户是否有权访问给定的个人资料。

答案 2 :(得分:2)

member = Member.query(Member.account==account).get()表示获取一个实例。

members = Member.query(Member.account==account).fetch()将结果返回到列表中。

memberQuery = Member.query(Member.account==account)返回一个Query类,可以再次过滤。