2010-08-11 15 views
9

Un modello di esempio:Interrogazione per un valore esistente nella proprietà lista di un modello in AppEngine

class Foo(db.Model): 
    id = db.IntegerProperty() 
    bar = db.ListProperty(int, required=True) 
  1. Come posso interrogare utilizzando Query o GqlQuery di restituire tutti i Foo entità che hanno un dato valore nella loro bar proprietà?

  2. Se si dispone di un elenco di ID, esiste un filtro singolo che restituirà tutte le entità la cui proprietà id si trova in tale elenco?

risposta

7

1.

Se si utilizza una uguale di query su una proprietà lista, controllerà tutti gli elementi della lista:

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

2.

È possibile utilizzare un Filtro IN, ma nota che internamente questo fa una query datastore per ogni elemento nell'elenco, quindi potrebbe essere lento e ci sono anche un massimo di 30 query interne per richiesta.

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

Vedi Introducing Queries per i dettagli sia per la 1 e 2, e ListProperty per ulteriori dettagli su 1.

2

Per quelli di voi come me che non hanno potuto ottenere la risposta sopra al lavoro.

Utilizzando gae versione 1.5.3

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

dà alcun risultato. Ma

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

dà risultati.

0

Inoltre è anche possibile utilizzare GQL .. questo potrebbe essere stato uno sviluppo che è accaduto nel tempo dal momento che la domanda è stata posta

Per la domanda 1

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

Per la domanda 2

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

Attenzione per la query in, però. In realtà eseguirà subquery N (una per ogni elemento nella clausola IN). Ecco la documentazione di Gql: https://developers.google.com/appengine/docs/python/datastore/gqlreference