2017-06-01 60 views
1

我在数据存储的用户模型包含一些属性:App Engine的查询用户

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' has no attribute 'company'

当我做:

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

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

如何按字段查询?谢谢

回答

1

您的问题有点误导。你问如何按字段查询,你已经用正确的语法进行了查询。正如杰夫奥尼尔指出的那样,问题是您的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() 
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所以我不知道那是什么。

+0

感谢杰夫,这就是我要的情况下,做我没有用更简单的方法取得成功。在重新实施方面更简单。 –