Создайте GQL с запросом "IN" для ReferenceProperty

сообщение класса (db.Model):

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

Я пробовал это, но получаю BadValueError в инструкции gql.

users = []

users.append (userA)

users.append (пользовательB)

users.append (userC)

messages = Message.gql ('Где пользователь в: пользователи', пользователи = пользователи) .fetch (100)


person dannyroa    schedule 03.08.2009    source источник


Ответы (4)


Трудно сказать без полной трассировки стека (пожалуйста?), Но я предполагаю, что IN не любит, когда передаются объекты, а не ключи. Попробуй это:

users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100
person Nick Johnson    schedule 03.08.2009

Оператор IN в GQL фактически синтезируется кодом Python на уровне приложения в виде цикла, выполняющего серию = выборок и объединяющих их - на самом деле он не является частью возможностей базового хранилища и поэтому, к сожалению, имеет некоторые ограничения (и его производительность никогда особенно хорошо). Я не уверен, что включение его в Python API было отличным дизайнерским решением (я считаю, что он не дублировался в Java API), но вот и все. (Кстати, у оператора != тоже есть похожие проблемы).

Я не уверен, почему, в частности, это должно мешать предполагаемому использованию, но я подозреваю, что это связано с тем, что объект "query" является экземпляром datastore.MultiQuery, а не просто datastore.Query - что произойдет, если вы сделаете это самостоятельно код Python уровня приложения, что обычно делает код Python уровня приложения, поставляемый GAE? См. В исходном файле SDK файл google / appengine / api / datastore.py, в частности класс MultiQuery - в конце концов, он сводится к выполнению всех отдельных запросов и объединению их результатов (в отсортированном порядке, если необходимо, но это не так '' кажется, здесь дело обстоит именно так).

person Alex Martelli    schedule 03.08.2009

с этими моделями:

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 в этом сообщении групп Google

person Kristian Damian    schedule 13.01.2010

Думаю, вам может понадобиться список ключей пользователей? попробуйте users.append (userA.key ()). Значение свойства user referenceproperty является ключом к пользовательской сущности.

person Community    schedule 03.08.2009