要在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
我有两个问题:
.fetch()
,代码将正确运行。但是,如果
没有使用.fetch()
,测试总是正确的,这意味着一些
检索实体。有什么问题?.fetch()
查询后所有实体?答案 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类,可以再次过滤。