Frage

class Message (db.Model):

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

Ich habe versucht, aber ich bin immer BadValueError auf der gql Aussage.

users = []

users.append (userA)

users.append (userB)

users.append (BenutzerC)

messages = Message.gql ( "Wo Benutzer in: Benutzer, Benutzer = Benutzer) .fetch (100)

War es hilfreich?

Lösung

Es ist schwer, ohne die vollständige Stacktrace zu sagen, (bitte?), Aber ich würde vermuten, dass nicht bestanden Einheiten mag sein, anstatt Tasten. Versuchen Sie folgendes:

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

Andere Tipps

Der IN Operator in GQL tatsächlich synthetisiert durch Application-Level-Python-Code als eine Schleife eine Reihe von = tun holt und verketten sie - es ist nicht wirklich Teil der Fähigkeiten des zugrunde liegenden Speicher und so ist leider unterliegt einigen Einschränkungen (und seine Leistung ist nie besonders gut). Ich bin mir nicht sicher, dass es eine große Design-Entscheidung war es in dem Python-API enthalten (ich glaube, es ist nicht in dem Java-API dupliziert wurde), aber, da sind Sie ja. (Btw, der != Betreiber hat ähnliche Probleme, auch).

Ich bin mir nicht sicher, warum insbesondere diese mit Ihrer beabsichtigten Nutzung stören soll, aber ich vermute, dass es auf das „Abfrage“ Objekt aufgrund ist eine Instanz von datastore.MultiQuery eher als Normal datastore.Query sein - was passiert, wenn Sie tun in Ihrem eigenen Python-Code auf Anwendungsebene, was die GAE-supplied Anwendungsebene Python-Code normalerweise der Fall ist? Sehen Sie in Ihrem SDK Quellen-Datei google / appengine / api / datastore.py, insbesondere die MultiQuery Klasse - am Ende läuft es darauf hinaus, um alle separate Abfragen zu tun und Zusammenführung ihrer Ergebnisse (in sortierter Reihenfolge, falls erforderlich, aber das doesn‘ t scheint hier der Fall zu sein).

Mit diesem Modell:

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)

Dieser Code funktioniert:

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

Ich sah die awnser in this Google Gruppen veröffentlichen

Ich glaube, Sie Schlüssel eine Liste der Benutzer wollen? versuchen users.append (user.key ()). Der Wert der Benutzer Referenz Eigenschaft ist ein Schlüssel zu einer Benutzereinheit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top