Google App Engine NDB: müssen fetch() nach der Abfrage?
Abrufen von Entitäten in Google App Engine NDB, muss ich fetch()
nach query()
? Zum Beispiel:
account = self.request.get('account')
member = Member.query(Member.account==account).fetch()
if member:
# Account exists
else:
# Account does not exist
Habe ich zwei Fragen:
- Wenn
.fetch()
verwendet wird, wird der code ordnungsgemäß ausgeführt. Allerdings, wenn
.fetch()
wird nicht verwendet, der test ist immer wahr, was bedeutet, dass einige
Entitäten abgerufen werden. Was ist das problem? - Im Allgemeinen brauche ich
.fetch()
wenn ich es abrufen möchten
alle Personen nach einer Abfrage?
- Als seitliche Anmerkung, der Schnellste Weg den ich kenne um dies zu erreichen Zustand (wenn Sie nicht brauchen, um die Person) ist
if Member.query(...).get(keys_only=True):
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
fetch()
nicht benutzt wird, dannmember = Member.query(..)
weist eine Query-Instanz der Klasse zumember
. Also deine if-Bedingung wahr ist.fetch()
führt die Abfrage aus und liefert Ergebnisse zurück. Nicht wieder alle Personen, nur jene definiert, die in den query-Parametern.fetch()
zum abrufen der Personen, die der Anfrage genügen? Das istmembers = Member.query(Member.age>20)
odermembers = Member.query(Member.age>20).fetch()
? Weil manchmal die Ergebnisse der ersteren sind geeignet für die spätere Verarbeitung, sondern manchmal sind Sie nicht. Was ist der Unterschied zwischen Ihnen?Member.query()
als iterator (for ent in query
abrufen der Ergebnisse in Chargen-und reibungslos Durchlaufen, oderfor ent in query.fetch()
abrufen alle Ergebnisse, die 'up-front' und die Iteration durch eine Liste von Entitäten.)member_query enthält nun eine Query-Instanz.
Von dort aus haben Sie ein paar Optionen, aber es scheint, dass Sie möchte nur schnappen Sie sich EINE Person aus dieser Abfrage. Das zu tun, würde Sie sagen.
Nun Mitglied ist entweder "None", wenn das Konto nicht vorhanden oder enthält eine Member-model-Instanz.
Wenn Sie verwenden .fetch () können Sie die Anzahl der Einheiten, die Sie abrufen möchten, und als das erste argument, oder verwenden Sie Keine (oder keine Argumente) zu greifen alle. Wenn es gibt eine Menge von Entitäten, die diese Bedingung erfüllen, könnte dies sehr zeitaufwendig sein.
Einem anderen Paradigma würde sich die zum Durchlaufen der Abfrage und Pause oder zurück auf die erste Person, die Ihren Bedingungen entspricht. Dieses Paradigma würde Ihnen erlauben, zu tun on-the-fly-Bedingungen nicht abgedeckt von der Abfrage-Parameter. Zum Beispiel...
Abfragen über diese Art der Mitgliedschaft-Modell ist weniger als ideal, aber da wird es erfordern, eine Abfrage ausführen, jedes mal. Natürlich, wenn Sie wollen, ein "Benutzer" haben Zugriff auf mehrere "profile" (wie Facebook Benutzer <-> Facebook-Seiten, als Beispiel), brauchen Sie etwas wie dieses.
Es ist viel effizienter, um die Struktur der Liste "Profile", die eine Konto zugreifen, etwa so:
Wie Sie sehen können, dies auch können Sie schnell bestimmen, ob ein Benutzer Zugriff auf ein bestimmtes Profil.
member = Member.query(Member.account==account).get()
Fall bekommen die eine Instanz.members = Member.query(Member.account==account).fetch()
gibt das Ergebnis in einer Liste.memberQuery = Member.query(Member.account==account)
gibt eine Query-Klasse, die gefiltert werden können, wieder.