使用ReferenceProperty的“IN”查询构建GQL

时间:2009-08-03 03:59:28

标签: google-app-engine gql

类消息(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)

4 个答案:

答案 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())。用户引用属性的值是用户实体的键。