类消息(db.Model):

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

我试过,但我得到的GQL陈述BadValueError。

用户= []

users.append(用户A)

users.append(用户B)

users.append(用户C)

消息= Message.gql('其中用户在:用户的,用户=用户).fetch(100)

有帮助吗?

解决方案

这很难说没有完整的堆栈跟踪(好吗?),但我猜想,在不喜欢被传递的实体,而不是键。尝试这样:

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.MultiQuery的一个实例,而不是普通的datastore.Query - 如果你这样做,会发生什么在自己的应用程序级的Python代码什么GAE提供的应用级Python代码正常呢?请参阅您的SDK源文件,谷歌/应用服务引擎/ API / datastore.py,特别是MultiQuery类 - 到底它归结为做所有的单独的查询和合并它们的结果(以排序的顺序,如果需要的话,但是那并不是”吨似乎是这里的情况)。

与该机型:

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 在此谷歌组张贴

我想你可能需要用户的密钥列表?尝试users.append(user.key())。用户参考属性的值是用户实体的密钥。

scroll top