2009-08-03 7 views
3

クラスのメッセージ(db.Model)のための「IN」クエリでGQL構築します。私はこれを試してみましたが、私はGQL文でBadValueErrorを取得していますReferenceProperty

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

ユーザー= []

users.append(ユーザーA)

users.append(ユーザーB)

users.append(よびUserC)

メッセージ= Message.gql( 'でユーザー:ユーザー、ユーザー=ユーザー)GQLで.fetch(100)

答えて

2

完全なスタックトレースなしでは分かりにくいですが、私はINがキーではなくエンティティを渡すのが好きではないと思います。これを試してみてください:

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

INオペレータは、実際にやってループとしてアプリケーションレベルのPythonコードによって合成されます=シリーズを取り出して連結しています。これは基本的な店舗の機能の一部ではないため、残念なことにいくつかの制限があります。私はそれがPython APIに組み込むのが素晴らしい設計上の決定ではないと確信しています(私はそれがJava APIで重複していないと信じています)。 (Btw、!=オペレータにも同様の問題があります)。

なぜこれがあなたの使用目的を妨げているのかよく分かりませんが、私はそれが通常のデータストアではなくdatastore.MultiQueryのインスタンスである「クエリ」オブジェクトによるものだと思っています。あなた自身のアプリケーションレベルのPythonコードで、GAE提供のアプリケーションレベルのPythonコードが通常行うことは何ですか? SDKソースのgoogle/appengine/api/datastore.pyファイル(特にMultiQueryクラス)を参照してください。最後に、すべての個別のクエリを実行し、結果をマージする(必要に応じてソートされた順序で、ここにあるように思われる)。

0

ユーザーのキーの一覧が必要なのでしょうか? users.append(userA.key())を試してください。ユーザー参照プロパティの値は、ユーザーエンティティのキ​​ーです。

1

をこのモデルで:

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 

私はawnserを見たin this google groups post

関連する問題