Создайте GQL с запросом IN для ReferenceProperty.
-
10-07-2019 - |
Вопрос
Сообщение класса (db.Model):
user = db.ReferenceProperty(User, required=True, collection_name='Message_set')
text = db.TextProperty(required=True)
Я попробовал это, но получаю BadValueError в операторе gql.
пользователи = []
пользователи.append(userA)
пользователи.append(userB)
пользователи.append(userC)
messages = Message.gql('Где пользователь: пользователи', пользователи=пользователи).fetch(100)
Решение
Трудно сказать без полной трассировки стека (пожалуйста?), но я предполагаю, что IN не любит, когда ему передаются сущности, а не ключи.Попробуй это:
users = [userA.key(), userB.key(), userC.key()]
messages = Message.gql("WHERE user in :users", users=users).fetch(100
Другие советы
А IN
Оператор в GQL фактически синтезируется кодом Python уровня приложения как цикл, выполняющий серию =
извлекает и объединяет их — на самом деле это не является частью возможностей базового хранилища и поэтому, к сожалению, подвержено некоторым ограничениям (и его производительность никогда не бывает особенно хорошей).Я не уверен, что включение его в API Python было хорошим дизайнерским решением (я считаю, что оно не дублировалось в API Java), но вот оно.(Кстати, !=
у оператора тоже есть подобные проблемы).
Я не уверен, почему именно это должно мешать вашему предполагаемому использованию, но я подозреваю, что это связано с тем, что объект "запрос" является экземпляром datastore.MultiQuery, а не простого datastore.Query - что произойдет, если вы сделаете это самостоятельно код Python уровня приложения, что обычно делает код Python уровня приложения, поставляемый GAE?См. в исходном файле SDK google/appengine/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
Я видел авзера в этом сообщении групп Google
Я думаю, вам может понадобиться список ключей пользователей?попробуйтеusers.append(userA.key()).Значение свойства user referenceproperty является ключом к пользовательскому объекту.