2009-08-03 3 views
3

(db.Model):.Construire un GQL avec « IN » requête pour un message de classe ReferenceProperty

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

J'ai essayé mais je suis en train de BadValueError sur la déclaration gql

utilisateurs = []

users.append (utilisateurA)

users.append (userB)

users.append (UserC)

messages = Message.gql ('où l'utilisateur Dans: les utilisateurs', utilisateurs = utilisateurs) .fetch (100)

Répondre

2

Il est difficile de dire sans la pile complète (s'il vous plaît?), Mais je suppose que IN n'aime pas passer des entités plutôt que des clés. Essayez ceci:

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

L'opérateur IN dans GQL est en fait synthétisé par niveau d'application du code Python comme une boucle faisant une Les séries de = les récupèrent et les concaténent - cela ne fait pas vraiment partie des capacités du magasin sous-jacent et est donc malheureusement soumis à certaines limitations (et ses performances ne sont jamais particulièrement bonnes). Je ne suis pas sûr que ce soit une bonne décision de conception de l'inclure dans l'API Python (je crois qu'il n'a pas été dupliqué dans l'API Java), mais, vous y êtes. (Btw, l'opérateur != a des problèmes similaires, aussi). Je ne suis pas sûr pourquoi en particulier cela devrait interférer avec votre utilisation prévue, mais je soupçonne que cela est dû à l'objet "requête" étant une instance de datastore.MultiQuery plutôt que simple datastore.Query - que se passe-t-il si vous faire dans votre propre code Python au niveau de l'application ce que fait normalement le code Python au niveau de l'application fourni par GAE? Voir dans le fichier de sources de votre SDK google/appengine/api/datastore.py, en particulier la classe MultiQuery - à la fin, il suffit de faire toutes les requêtes séparées et de fusionner leurs résultats (dans l'ordre, si nécessaire, mais cela ne marche pas Il semble que ce soit le cas ici).

0

Je pense que vous voudrez peut-être une liste des clés des utilisateurs? essayez users.append (userA.key()). La valeur de l'utilisateur referenceproperty est une clé pour une entité utilisateur.

1

avec ces modèles:

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) 

Ce code fonctionne:

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 

J'ai vu le awnser in this google groups post

Questions connexes