1

webapp2_extras.appengine.auth.models.Userを基本的に拡張するサービスを利用していgoogle.appengine.api.users modelます。現在、アプリケーションにカスタム ユーザーが登録されており、多くのカスタム フィールドがあります。問題は、さまざまなカスタム フィールドを使用してすべてのユーザーをフィルタリング/(マルチ フィルター) したいことです。例えば:

ユーザーモデルには2つのフィールドが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

しかし、これは次のようにエラーを発生させます:

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.Usercreatedupdatedauth_idsおよびpasswordプロパティを持つ Expando モデルです。それ以上のすべてまたはカスタム プロパティは、不透明な BLOB として格納されます。つまり、インデックスは作成されません。とはいえ、それらをクエリ/フィルタリングすることはできません。

モデルをサブクラス化し、User必要なプロパティを追加するか、(より良い) 新しいモデルを作成することができます (たとえばAccount)。

これは、データストアを扱うときにモデルをできるだけ小さく保つための良い習慣です。これが理由です。エンティティをフェッチするたびに、それらすべてをフェッチする必要がある数十のプロパティを持つモデルを検討してください。ネットワークはここでは問題ではありません。つまり、protobuf デコードであり、Python はそれが得意ではありません。

于 2012-06-06T14:10:53.890 に答える