Вопрос

Сообщение класса (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 является ключом к пользовательскому объекту.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top