2010-04-21 2 views

risposta

12

Sì, è praticamente tutto. Recupera tutte le entità che desideri sommare e sommale nella tua app. Non c'è SUM in GQL.

Se quello che stai cercando di ottenere è trovare il punteggio medio per un'entità, c'è un modo migliore.

class RateableThing(db.Model): 
    num_ratings = db.IntegerProperty() 
    avg_rating = db.FloatProperty() 

Trovare valutazione media della cosa è una semplice ricerca, e l'aggiunta di un nuovo rating è solo:

thing.avg_ratings = ((thing.avg_ratings * thing.num_ratings) + new_rating)/thing.num_ratings + 1 
thing.num_ratings += 1 
thing.put() 

Il linguaggio prevalente del datastore App Engine è quello di fare il lavoro il più possibile su scrivi, e il meno possibile in lettura, poiché le letture accadranno molto più spesso.

+0

intendi in ogni scrittura per calcolare il voto e scriverlo su ogni scrittura e non calcolare su letto? chiama la cosa.num_ratings ottiene l'intera somma delle entità? o devo solo i numeri su ogni scrittura? perché mi sono trasferito in un archivio dati per duplicare e salvare le chiavi per ogni classificazione in modo da poter sapere chi ha valutato cosa e così via. non voglio un'entità somma che continua ad aggiornare. È questo che vuoi dire? – Alon

+0

'num_ratings' è il numero di volte in cui la cosa è stata valutata. Quindi, ogni volta che aggiungi una valutazione, incrementa 'num_ratings' - se vuoi tenere traccia di chi ha votato, puoi mantenere una' ListProperty' degli utenti. Se si desidera tenere traccia di chi ha valutato, * e cosa hanno valutato *, un oggetto 'ListProperty' di' Rating' (utente e punteggio). Ma continua a mantenere la valutazione semplice (num_ e avg_) per evitare di calcolare su ogni lettura della valutazione della cosa. Solo quando si desidera esaminare i dati di valutazione completi si dovrebbe andare nella lista delle valutazioni degli utenti. –

+0

quindi dovrei sempre tenere una tabella riepilogativa per la valutazione in cui sono aumentata la valutazione su ciascuna classificazione dell'utente per il calcolo. grazie mille :) – Alon

0

Non posso rispondere da parte di Google App Engine della tua domanda, ma il codice (se si modifica la + ad un +=) è equivalente a:

ratingsum = sum(ratings) 

Sono abbastanza sicuro che è possibile utilizzare sum() su qualsiasi sequenza o iterabile contenente oggetti tipo numero.

+0

alla tua risposta, non posso. è un galleggiante. 4.5. non posso riassumere e aggiungerlo. non è iterable :( – Alon