2010-08-11 3 views
9

Ein Beispielmodell:Querying für einen Wert in einer Liste des Modells in AppEngine vorhandene Eigenschaft

class Foo(db.Model): 
    id = db.IntegerProperty() 
    bar = db.ListProperty(int, required=True) 
  1. Wie kann ich abfragen entweder Abfrage oder GqlQuery mit allen Foo Entitäten zurückgeben, die einen bestimmten Wert haben in ihrer bar eigenschaft?

  2. Wenn ich eine Liste von IDs habe, gibt es einen einzelnen Filter, der alle Entitäten zurückgibt, deren id Eigenschaft in dieser Liste ist?

Antwort

7

1.

Wenn Sie ein Gleichheits Abfrage auf einer Liste Eigenschaft verwenden, werden alle Elemente in der Liste überprüfen:

search = 2 
results = Foo.all().filter('bar =', search).fetch() 

2.

Sie ein verwenden können IN-Filter, aber beachten Sie, dass dies intern eine Datenspeicherabfrage für jedes Element in der Liste vornimmt, so dass es langsam sein kann, und es gibt auch maximal 30 interne Abfragen pro Anfrage.

items = [1, 2, 3] 
results = Foo.all().filter("id IN", items).fetch() 

Siehe Introducing Queries für Details für beide 1 und 2, und ListProperty Weitere Details zu 1.

2

Für diejenigen von euch mögen mich, die nicht die oben genannte Antwort arbeiten konnte.

Mit gae Version 1.5.3

results = Foo.all().filter('bar =', search).fetch() 

gibt keine Ergebnisse. Aber

results = Foo.all().filter('bar =', search).fetch(100) 
results = Foo.all().filter('bar =', search) 

gibt Ergebnisse.

0

Zusätzlich können Sie auch GQL verwenden .. dies eine Entwicklung gewesen sein kann, die in der Zeit geschehen, seit die Frage

Für Fragen gestellt wurde 1

wheres = 2 
pageSize = 10 
qry = db.GqlQuery("SELECT * FROM Foo WHERE bar = :1", wheres) 
Foos = qry.fetch(pageSize) 

Zu Frage 2

wheres = [ 1, 3, 44, 101 ] 
pagesize = 10 
qry = db.GqlQuery("SELECT * FROM Foo WHERE bar IN (:1)", wheres) 
Foos = qry.Fetch(pageSize) 

Achten Sie jedoch auf die in Abfrage. Es wird tatsächlich N Unterabfragen ausführen (eine für jedes Element in Ihrer IN-Klausel). Hier ist die Gql-Dokumentation: https://developers.google.com/appengine/docs/python/datastore/gqlreference

Verwandte Themen