0

AppEngine フレームワークで ndb を使用してオブジェクトをクエリしようとすると、問題が発生します。私はndbを初めて使用し、いくつかの重要な概念を誤解していると思います。

これが私が持っているものです:

私は自分のモデルを持っていますTeacher

from webapp2_extras.appengine.auth.models import User

class Teacher(ndb.Model):
    user = ndb.StructuredProperty(User)
    ranking = ndb.FloatProperty(required=True)

ご覧のとおり、ユーザー モデルは webapp2 フレームワークから取得されます。次に、あるユーザーに関連付けられている教師にクエリを実行しようとします。私はこのようにします:

def _findTeacher(self, user):
    t = Teacher.query(Teacher.user == user).fetch(1)
    if t:
        return t[0]
    else:
        return None

この関数のパラメーターとして渡されるユーザーは、次のように取得されます。

user_session = self.auth.get_user_by_session()
user = self.auth.store.user_model.get_by_auth_token(user_session['user_id'], user_session['token'])[0]

しかし、次のエラーが表示されます。

BadFilterError: invalid filter: Cannot query for non-empty repeated property auth_ids.

私の間違いがどこにあるかを本当に知りたいです。また、ndb と webapp2 認証システムを使用するアプリの例も非常に役立ちます。

皆さん、ありがとうございました

4

1 に答える 1

1

NDB プロパティから:

StructuredProperty は繰り返すことができ、StructuredProperty には別の StructuredProperty を含めることができますが、注意してください: 1 つの structred プロパティに別のプロパティが含まれる場合、それらの 1 つだけを繰り返すことができます。

Teacher.User は、StructuredProperty の繰り返しである Teacher.User.auth_ids を含む StructuredProperty であるため、エラーが発生しています。

編集(解決策):

これを行うことをお勧めします:

class Teacher(ndb.Model):
    user = ndb.KeyProperty(User)
    ranking = ndb.FloatProperty(required=True)

ユーザーへの参照を保存します。上記の例では、これが機能します。ただし、これは、ユーザーのプロパティ ( など) を照会できないことも意味しますTeacher.User.name == 'bob'

そして、次のようにクエリします。

t = Teacher.query(Teacher.user == user.key).fetch(1)

これが役立つことを願っています。

于 2013-03-20T23:30:11.043 に答える