質問

クラスのメッセージ(dbです。モデル):

user = db.ReferenceProperty(User, required=True, collection_name='Message_set')  
text = db.TextProperty(required=True)

したがっBadValueErrorのgqlます。

ユーザー=[]

ユーザーappend(userA)

ユーザーappend(userB)

ユーザーappend(userC)

メッセージ=メッセージ。gql('がユーザー:ユーザ、ユーザー=すものではありません。fetch(100)

役に立ちましたか?

解決

完全なスタックトレースなしで伝えるのは難しいですが(お願い?)、INはキーではなくエンティティを渡すのが嫌いだと思います。これを試してください:

users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100

他のヒント

GQLの IN 演算子は、一連の = を取得して連結するループとしてアプリケーションレベルのPythonコードによって実際に合成されます。基礎となるストアの機能などは、残念ながらいくつかの制限を受けます(そして、そのパフォーマンスは決してそれほど良くありません)。 Python APIにそれを含めることが設計上の大きな決定であったかどうかはわかりません(Java APIには複製されていないと思います)。 (ところで、!= 演算子にも同様の問題があります。)

特にこれが意図した使用を妨げる理由はわかりませんが、「クエリ」が原因だと思われます。オブジェクトはプレーンなdatastore.Queryではなくdatastore.MultiQueryのインスタンスである-GAEが提供するアプリケーションレベルのPythonコードが通常行うことを、独自のアプリケーションレベルのPythonコードで行うとどうなりますか? SDKのソースファイルgoogle / appengine / api / datastore.py、特にMultiQueryクラスを参照してください。最終的には、すべての個別のクエリを実行し、結果をマージします(必要に応じて、並べ替えられた順序ですが、 tはここに当てはまるようです。

このモデルでは:

class MyUsuario(db.Model):
    nombre=db.StringProperty(required=True)

class Message(db.Model):
    MyUsuario = db.ReferenceProperty(MyUsuario, required=True, collection_name='Message_set')  
    text = db.StringProperty(required=True)

このコードは機能します:

from modelos import MyUsuario, Message
from google.appengine.ext import db

usuarios=MyUsuario.all()

userA=usuarios[0]
userB=usuarios[1]
userC=usuarios[2]

usuarios= []

usuarios.append(userA.key())
usuarios.append(userB.key())
usuarios.append(userC.key())

messages = db.GqlQuery('select * from Message Where MyUsuario In :usuari', usuari=usuarios)

for message in messages:
    print message.text

このgoogleグループの投稿でawnser を見ました

と思いきたいリストのユーザーのキー?います。append(userA.key()).の値をユーザー referencepropertyはユーザー団体をいう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top