App Engine查询用户

时间:2017-06-01 13:45:56

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

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

enter image description here

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

所以,正如我通常所做的那样,我这样做:

from webapp2_extras.appengine.auth.models import User

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

这给了我:

  

AttributeError:type object' User'没有属性'公司'

当我这样做时:

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

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

如何按字段查询?感谢

2 个答案:

答案 0 :(得分:1)

您已导入由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因此我不知道究竟是什么。

答案 1 :(得分:1)

你的问题有点误导。您询问如何按字段查询,您已使用正确的语法进行查询。正如Jeff O'Neill指出的那样,问题是你的User模型没有company字段,因此逐个字段的尝试会导致错误。 (Here is some ndb documentation如果你还没有,你一定要仔细阅读和书签。)有三种方法可以解决你的遗失问题:

  1. User模型子类化,正如Jeff在答案中所示。这快速而简单,可能是您想要的最佳解决方案。
  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)分开。如果您想为每个用户存储个人资料图片或其他相对大量的数据,您可能会发现此解决方案最适合您。

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