我正在使用基本扩展webapp2_extras.appengine.auth.models.User
的{{1}}服务。现在,我有自己的应用程序注册的自定义用户,他们有很多自定义字段。问题是我想使用各种自定义字段过滤/(多重过滤)所有用户。例如:
用户模型有2个字段google.appengine.api.users model
和is_active
现在我想使用这些字段过滤它们,例如:
activation_key
使用自定义字段过滤用户模型的最佳方法是什么?
编辑:
还尝试了以下内容:
from google.appengine.api import users
act_key = 'hw-2j38he63u83hd6hak3FshSqj3TGemn9'
user = users.all().filter('is_active =', False).filter('activation_key =', act_key).get()
if user:
return True
else:
return False
但是这会产生如下错误:
from webapp2_extras.appengine.auth.models import User
query = User.query().filter('is_active =', False)
print query
答案 0 :(得分:6)
在NDB中查询Expando属性的语法与在旧的DB API中完成的方式略有不同,并记录在案here。您的查询需要看起来像这样:
user = users.all().filter(ndb.GenericProperty('is_active') == False, ndb.GenericProperty('activation_key) == act_key).get()
答案 1 :(得分:1)
是使用db
包或ndb
?
对于第一个问题,如果您只需要检查用户是否存在,您可以进行keys_only查询.all(keys_only=True).filter(...
使用webapp2查询时遇到的错误用户模型取决于ndb包。使用ndb,查询的正确语法是:
User.query().filter(User.is_active == False)
或
User.query(User.is_active == False)
当然,您需要查询自定义用户模型。
答案 2 :(得分:1)
webapp2_extras.appengine.auth.models.User
是具有created
,updated
,auth_ids
和password
属性的Expando模型。除此之外的所有内容或自定义属性都将存储为不透明的blob,即不会被编入索引。也就是说,人们无法查询/过滤它们。
你可以继承User
模型并添加你需要的属性或(更好)创建一个新模型(比如Account
)。
这是处理数据存储区以保持模型尽可能小的一个好习惯,这就是为什么:考虑一个具有许多属性的模型,每次获取一个实体,你需要获取它们全部;网络在这里不是问题,那就是protobuf解码,而Python并不擅长它。