Question

message de classe (db.Model):

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

J'ai essayé cela, mais j'obtiens BadValueError sur l'instruction gql.

utilisateurs = []

users.append (userA)

users.append (userB)

users.append (userC)

messages = Message.gql ('Où utilisateur dans: utilisateurs', utilisateurs = utilisateurs) .fetch (100)

Était-ce utile?

La solution

C'est difficile à dire sans le stacktrace complet (s'il vous plaît?), mais je suppose que IN n'aime pas être passé d'entités plutôt que de clés. Essayez ceci:

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

Autres conseils

L'opérateur IN dans GQL est actuellement synthétisé par le code Python au niveau de l'application sous la forme d'une boucle effectuant une série d'extraits = et les concaténant - cela ne fait pas vraiment partie de les capacités du magasin sous-jacent et sont donc malheureusement soumises à certaines limitations (et ses performances ne sont jamais très bonnes). Je ne suis pas sûr que la décision de l'inclure dans l'API Python ait été une décision de conception intéressante (je pense que cela n'a pas été dupliqué dans l'API Java), mais voilà. (Au fait, l'opérateur ! = a aussi des problèmes similaires).

Je ne sais pas pourquoi cela devrait en particulier gêner votre utilisation prévue, mais je suppose que cela est dû à la "requête". objet étant une instance de datastore.MultiQuery plutôt que plain datastore.Query - que se passera-t-il si vous faites dans votre propre code Python au niveau de l'application ce que le code Python au niveau de l'application fourni par GAE fait normalement? Voir dans votre fichier de sources SDK google / appengine / api / datastore.py, en particulier la classe MultiQuery - cela revient à faire toutes les requêtes séparées et à fusionner leurs résultats (par ordre de tri, si nécessaire, mais cela ne semble pas être le cas ici).

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 la lame dans cet article de groupe Google

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top