App Engine 查询用户
App Engine Query Users
我的数据存储中有用户模型,其中包含一些属性:
我需要查询所有按 company
属性过滤的用户。
所以,我通常会这样做:
from webapp2_extras.appengine.auth.models import User
employees = User.query().filter(User.company == self.company_name).fetch()
这给了我:
AttributeError: type object 'User' has no attribute 'company'
当我这样做时:
employees = User.query().filter().fetch()
它没有给我任何错误,并显示了包含所有用户的列表。
如何按字段查询?谢谢
您已导入由 webapp2 定义的 User
class。此 User
class 没有名为 company
的属性,因此这就是您从 User.company
.
收到错误的原因
您可能想要通过子classing webapp2 提供的模型来创建您自己的User
模型:
from webapp2_extras.appengine.auth.models import User as Webapp2_User
class User(Webapp2_User):
company = ndb.StringProperty()
那么您的查询应该有效。
请注意,我从未使用过 webapp2_extras.appengine.auth.models
,所以我不知道那到底是什么。
你的问题有点误导。您询问如何按字段查询,您已经使用正确的语法进行了查询。正如 Jeff O'Neill 指出的那样,问题是您的 User
模型没有 company
字段,因此您的逐字段查询尝试会导致错误。 (Here is some ndb documentation 如果您还没有仔细阅读并添加书签,那绝对应该。)可以通过三种方法来解决您的缺失字段问题:
- 子类化
User
模型,正如杰夫在他的回答中所展示的那样。这既快速又简单,可能是您想要的最佳解决方案。
- 创建您自己的用户模型,与 webapp2 完全分开。仅从您的问题来看,这对于您想要的可能有点矫枉过正,因为您必须自己编写 webapp2 用户已经为您处理的大部分身份验证代码。
创建一个包含额外用户信息的新模型,并有一个包含相应用户密钥的密钥属性。看起来像这样:
class UserProfile(ndb.Expando):
user_key = ndb.KeyProperty(kind='User', required=True)
company = ndb.StringProperty()
# other possibilities: profile pic? address? etc.
查询如下:
from models.user_profile import UserProfile
from webapp2_extras.appengine.auth.models import User
from google.appengine.ext import ndb
# get the employee keys
employee_keys = UserProfile.query(UserProfile.company == company_name).fetch(keys_only=True)
# get the actual user objects
employees = ndb.get_multi(employee_keys)
此解决方案的作用是将用于身份验证的用户模型(webapp2 的用户)与保存额外用户信息的模型(UserProfile)分开。如果您想为每个用户存储个人资料图片或其他相对大量的数据,您可能会发现此解决方案最适合您。
注意:您可以将筛选条件放在.query()
括号中以简化操作(我发现我很少使用.filter()
方法):
# long way
employees = User.query().filter(User.company == self.company_name).fetch()
# shorter way
employees = User.query(User.company == self.company_name).fetch()
我的数据存储中有用户模型,其中包含一些属性:
我需要查询所有按 company
属性过滤的用户。
所以,我通常会这样做:
from webapp2_extras.appengine.auth.models import User
employees = User.query().filter(User.company == self.company_name).fetch()
这给了我:
AttributeError: type object 'User' has no attribute 'company'
当我这样做时:
employees = User.query().filter().fetch()
它没有给我任何错误,并显示了包含所有用户的列表。
如何按字段查询?谢谢
您已导入由 webapp2 定义的 User
class。此 User
class 没有名为 company
的属性,因此这就是您从 User.company
.
您可能想要通过子classing webapp2 提供的模型来创建您自己的User
模型:
from webapp2_extras.appengine.auth.models import User as Webapp2_User
class User(Webapp2_User):
company = ndb.StringProperty()
那么您的查询应该有效。
请注意,我从未使用过 webapp2_extras.appengine.auth.models
,所以我不知道那到底是什么。
你的问题有点误导。您询问如何按字段查询,您已经使用正确的语法进行了查询。正如 Jeff O'Neill 指出的那样,问题是您的 User
模型没有 company
字段,因此您的逐字段查询尝试会导致错误。 (Here is some ndb documentation 如果您还没有仔细阅读并添加书签,那绝对应该。)可以通过三种方法来解决您的缺失字段问题:
- 子类化
User
模型,正如杰夫在他的回答中所展示的那样。这既快速又简单,可能是您想要的最佳解决方案。 - 创建您自己的用户模型,与 webapp2 完全分开。仅从您的问题来看,这对于您想要的可能有点矫枉过正,因为您必须自己编写 webapp2 用户已经为您处理的大部分身份验证代码。
创建一个包含额外用户信息的新模型,并有一个包含相应用户密钥的密钥属性。看起来像这样:
class UserProfile(ndb.Expando): user_key = ndb.KeyProperty(kind='User', required=True) company = ndb.StringProperty() # other possibilities: profile pic? address? etc.
查询如下:
from models.user_profile import UserProfile from webapp2_extras.appengine.auth.models import User from google.appengine.ext import ndb # get the employee keys employee_keys = UserProfile.query(UserProfile.company == company_name).fetch(keys_only=True) # get the actual user objects employees = ndb.get_multi(employee_keys)
此解决方案的作用是将用于身份验证的用户模型(webapp2 的用户)与保存额外用户信息的模型(UserProfile)分开。如果您想为每个用户存储个人资料图片或其他相对大量的数据,您可能会发现此解决方案最适合您。
注意:您可以将筛选条件放在.query()
括号中以简化操作(我发现我很少使用.filter()
方法):
# long way
employees = User.query().filter(User.company == self.company_name).fetch()
# shorter way
employees = User.query(User.company == self.company_name).fetch()