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 如果您还没有仔细阅读并添加书签,那绝对应该。)可以通过三种方法来解决您的缺失字段问题:

  1. 子类化 User 模型,正如杰夫在他的回答中所展示的那样。这既快速又简单,可能是您想要的最佳解决方案。
  2. 创建您自己的用户模型,与 webapp2 完全分开。仅从您的问题来看,这对于您想要的可能有点矫枉过正,因为您必须自己编写 webapp2 用户已经为您处理的大部分身份验证代码。
  3. 创建一个包含额外用户信息的新模型,并有一个包含相应用户密钥的密钥属性。看起来像这样:

    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()