我的数据存储区中有User模型,其中包含一些属性:
我需要查询按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()
它没有给我任何错误,并显示所有用户的列表。
如何按字段查询?感谢
答案 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如果你还没有,你一定要仔细阅读和书签。)有三种方法可以解决你的遗失问题:
User
模型子类化,正如Jeff在答案中所示。这快速而简单,可能是您想要的最佳解决方案。创建一个包含额外用户信息的新模型,并具有包含相应用户密钥的密钥属性。这看起来像这样:
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()