Domanda

messaggio di classe (db.Model):

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

Ho provato questo ma sto ottenendo BadValueError sull'istruzione gql.

utenti = []

users.append (userA)

users.append (userB)

users.append (UtenteC)

messages = Message.gql ('Where user In: users', users = users) .fetch (100)

È stato utile?

Soluzione

È difficile dirlo senza lo stacktrace completo (per favore?), ma immagino che IN non gradisca il passaggio di entità piuttosto che chiavi. Prova questo:

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

Altri suggerimenti

L'operatore IN in GQL è in realtà sintetizzato dal codice Python a livello di applicazione come un ciclo che esegue una serie di = li recupera e li concatena - non fa davvero parte di le capacità del negozio sottostante e quindi purtroppo sono soggette ad alcune limitazioni (e le sue prestazioni non sono mai particolarmente buone). Non sono sicuro che sia stata un'ottima decisione di progettazione includerlo nell'API Python (credo che non sia stato duplicato nell'API Java), ma eccoti qui. (A proposito, anche l'operatore ! = ha problemi simili).

Non sono sicuro del motivo per cui, in particolare, ciò dovrebbe interferire con l'utilizzo previsto, ma sospetto che sia dovuto alla "query" oggetto che è un'istanza di datastore.MultiQuery piuttosto che semplice datastore.Query - cosa succede se si fa nel proprio codice Python a livello di applicazione cosa fa normalmente il codice Python a livello di applicazione fornito da GAE? Vedi nel tuo file sorgenti SDK google / appengine / api / datastore.py, in particolare la classe MultiQuery - alla fine si riduce a fare tutte le query separate e unire i loro risultati (in ordine ordinato, se necessario, ma non lo fa ' sembra essere il caso qui).

con questi modelli:

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)

Questo codice funziona:

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

Ho visto il tendalino in questo post di gruppi di Google

Penso che potresti desiderare un elenco di chiavi degli utenti? prova users.append (user.key ()). Il valore della proprietà di riferimento dell'utente è una chiave per un'entità utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top