Pregunta

Mensaje de clase (db.Model):

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

Intenté esto pero recibo BadValueError en la instrucción gql.

usuarios = []

users.append (userA)

users.append (userB)

users.append (userC)

messages = Message.gql ('Donde usuario en: usuarios', usuarios = usuarios) .fetch (100)

¿Fue útil?

Solución

Es difícil saberlo sin el stacktrace completo (¿por favor?), pero supongo que a IN no le gusta que le pasen entidades en lugar de claves. Prueba esto:

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

Otros consejos

El operador IN en GQL en realidad se sintetiza mediante el código Python a nivel de aplicación como un bucle que realiza una serie de captaciones = y las concatena, no es realmente parte de Las capacidades de la tienda subyacente, por lo que lamentablemente están sujetas a algunas limitaciones (y su rendimiento nunca es particularmente bueno). No estoy seguro de que fue una gran decisión de diseño incluirlo en la API de Python (creo que no estaba duplicado en la API de Java), pero ahí lo tienes. (Por cierto, el operador ! = también tiene problemas similares).

No estoy seguro de por qué, en particular, esto debería interferir con el uso previsto, pero sospecho que se debe a la " consulta " el objeto es una instancia de datastore.MultiQuery en lugar de un simple datastore.Query: ¿qué sucede si hace en su propio código Python de nivel de aplicación lo que hace normalmente el código Python de nivel de aplicación proporcionado por GAE? Vea en su archivo de fuentes del SDK google / appengine / api / datastore.py, específicamente la clase MultiQuery: al final se reduce a hacer todas las consultas por separado y fusionar sus resultados (en orden, si es necesario, pero eso no ' parece ser el caso aquí).

con estos modelos:

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)

Este código funciona:

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

Vi el awnser en esta publicación de grupos de Google

¿Creo que puede querer una lista de claves de usuario? intente users.append (user.key ()). El valor de la propiedad de referencia del usuario es una clave para una entidad de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top