3

类消息(db.Model):

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

我试过这个,但我在 gql 语句上得到了 BadValueError 。

用户 = []

users.append(userA)

users.append(userB)

users.append(userC)

messages = Message.gql('Where user In :users', users=users).fetch(100)

4

4 回答 4

2

GQL 中的IN运算符实际上是由应用程序级 Python 代码合成为一个循环,执行一系列=提取并将它们连接起来——它实际上并不是底层存储功能的一部分,因此很遗憾受到一些限制(而且它的性能从来都不是特别好)好的)。我不确定将它包含在 Python API 中是否是一个很好的设计决定(我相信它在 Java API 中没有重复),但是,你就是这样。(顺便说一句,!=运营商也有类似的问题)。

我不确定为什么这会特别干扰您的预期用途,但我怀疑这是由于“查询”对象是 datastore.MultiQuery 的实例而不是普通的 datastore.Query - 如果您自己做会发生什么应用程序级 Python 代码 GAE 提供的应用程序级 Python 代码通常是做什么的?在您的 SDK 源文件 google/appengine/api/datastore.py 中查看,特别是 MultiQuery 类 - 最后它归结为执行所有单独的查询并合并它们的结果(如果需要,按排序顺序,但这并不这里似乎不是这样)。

于 2009-08-03T05:16:49.530 回答
2

如果没有完整的堆栈跟踪(请?),很难判断,但我猜 IN 不喜欢传递实体而不是键。试试这个:

users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100
于 2009-08-03T12:30:12.057 回答
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

我在这个谷歌群组帖子中看到了遮阳篷

于 2010-01-13T20:24:52.627 回答
0

我想你可能想要一个用户密钥列表?试试 users.append(userA.key())。用户引用属性的值是用户实体的键。

于 2009-08-03T06:56:16.310 回答