【问题标题】:App Engine Query UsersApp Engine 查询用户
【发布时间】:2017-11-02 16:57:43
【问题描述】:

我的数据存储中有 User 模型,其中包含一些属性:

我需要查询所有按company属性过滤的用户。

所以,我通常会这样做:

from webapp2_extras.appengine.auth.models import User

employees = User.query().filter(User.company == self.company_name).fetch()

这给了我:

AttributeError:类型对象“用户”没有属性“公司”

当我这样做时:

employees = User.query().filter().fetch()

它没有给我任何错误并显示所有用户的列表。

如何按字段查询?谢谢

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore webapp2


    【解决方案1】:

    你的问题有点误导。您询问如何按字段查询,您已经使用正确的语法进行了查询。正如 Jeff O'Neill 所指出的,问题在于您的 User 模型没有 company 字段,因此您的逐字段查询尝试会导致错误。 (Here is some ndb documentation,如果您还没有仔细阅读并添加书签,请务必仔细阅读。)有三种方法可以解决您的缺失字段问题:

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

      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 的用户)与保存额外用户信息的模型(用户配置文件)分开。如果您想为每个用户存储个人资料图片或其他相对大量的数据,您可能会发现此解决方案最适合您。

    注意:您可以将过滤条件放在.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()
    

    【讨论】:

      【解决方案2】:

      您已导入由 webapp2 定义的 User 类。这个User 类没有名为company 的属性,这就是为什么您会从User.company 收到错误。

      您可能希望通过继承 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,所以我不知道那到底是什么。

      【讨论】:

      • 谢谢杰夫,如果我没有用更简单的方法成功的话,我会这样做。在重新实现工作方面更简单。
      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 2012-07-23
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多