1

我正在使用webapp2_extras.appengine.auth.models.User基本上扩展了google.appengine.api.users model. 现在,我在我的应用程序中注册了自定义用户,他们有很多自定义字段。问题是我想使用各种自定义字段过滤/(多过滤器)所有用户。例如:

用户模型有 2 个字段is_activeactivation_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

但这会引发如下错误:

Traceback (most recent call last):
File "/opt/google_appengine_1.6.4/google/appengine/ext/admin/__init__.py", line 320, in post
exec(compiled_code, globals())
File "<string>", line 6, in <module>
File "lib/ndb/query.py", line 968, in filter
raise TypeError('Cannot filter a non-Node argument; received %r' % arg)
TypeError: Cannot filter a non-Node argument; received 'is_active ='
4

3 回答 3

6

在 NDB 中查询 Expando 属性的语法与在旧 DB API 中的执行方式略有不同,并在此处记录。您的查询需要看起来像这样:

user = users.all().filter(ndb.GenericProperty('is_active') == False, ndb.GenericProperty('activation_key) == act_key).get()
于 2012-06-07T00:22:20.030 回答
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)

当然,您需要查询您的自定义用户模型。

于 2012-06-06T13:56:53.987 回答
1

webapp2_extras.appengine.auth.models.User是具有createdupdated和属性auth_ids的Expando 模型。password除此以外的所有内容或自定义属性都将存储为不透明的 blob,即不会被索引。也就是说,无法查询/过滤它们。

您可以对User模型进行子类化并添加您需要的属性,或者(更好)创建一个新模型(例如Account)。

在处理 Datastore 以使模型尽可能小时,这是一个好习惯,这就是为什么:考虑一个具有数十个属性的模型,每次获取一个实体时都需要获取所有属性;网络在这里不是问题,什么是 protobuf 解码,而 Python 并不擅长它。

于 2012-06-06T14:10:53.890 回答