类消息(db.Model):
user = db.ReferenceProperty(User, required=True, collection_name='Message_set')
text = db.TextProperty(required=True)
我尝试了这个但是我在gql语句中得到了BadValueError。
users = []
users.append(用户A)
users.append(用户B)
users.append(用户C)
messages = Message.gql('用户位于:用户',用户=用户).fetch(100)
答案 0 :(得分:2)
GQL中的IN
运算符实际上由应用程序级Python代码合成,作为循环执行一系列=
提取并连接它们 - 它实际上并不是底层存储功能的一部分,因此不幸的是受到一些限制(其表现从来没有特别好)。我不确定将它包含在Python API中是一个很好的设计决策(我相信它在Java API中没有重复),但是,你有。 (顺便说一下,!=
运算符也有类似的问题。)
我不确定为什么这会干扰你的预期用法,但我怀疑它是由于“查询”对象是datastore.MultiQuery的一个实例,而不是简单的datastore.Query - 如果你这样做会发生什么在您自己的应用程序级Python代码中,GAE提供的应用程序级Python代码通常做什么?请参阅SDK源文件google / appengine / api / datastore.py,特别是MultiQuery类 - 最后归结为执行所有单独查询并合并其结果(按排序顺序,如果需要,但不是'似乎就是这种情况。)
答案 1 :(得分:2)
没有完整的堆栈跟踪很难说(请?),但我猜想IN不喜欢被传递的实体而不是键。试试这个:
users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100
答案 2 :(得分: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
答案 3 :(得分:0)
我想你可能想要一个用户密钥列表?尝试users.append(user.key())。用户引用属性的值是用户实体的键。