建立与的ReferenceProperty“IN”查询GQL
-
10-07-2019 - |
题
类消息(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())。用户参考属性的值是用户实体的密钥。
不隶属于 StackOverflow