2010-04-21 12 views

Respuesta

12

Sí, eso es más o menos. Recupere todas las entidades que desea sumar y sumézcalas en su aplicación. No hay SUM en GQL.

Si lo que estás tratando de lograr es encontrar la calificación promedio de una entidad, hay una mejor manera.

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

Encontrar calificación promedio de la cosa es una búsqueda simple, y la adición de una nueva calificación es simplemente:

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

El idioma predominante del almacén de datos de App Engine es hacer tanto trabajo como sea posible en escriba, y lo menos posible en lectura, ya que las lecturas ocurrirán con mucha más frecuencia.

+0

¿Qué quieres decir en cada escritura para calcular la calificación y escribirla en cada escritura y no calcular en lectura? ¿Llamar a thing.num_ratings obtiene la suma total de las entidades? o debería simplemente subir los números en cada escritura? porque me mudé a las duplicaciones de almacenamiento de datos y guardo las claves para cada calificación para poder saber quién calificó qué y así sucesivamente. No quiero una entidad de suma que siga actualizando. ¿Es eso lo que quieres decir? – Alon

+0

'num_ratings' es la cantidad de veces que se calificó la cosa. Por lo tanto, cada vez que agregue una calificación, incremente 'num_ratings'; si desea realizar un seguimiento de quién está calificado, puede conservar' ListProperty' de los usuarios. Si desea realizar un seguimiento de quién calificó, * y qué calificó *, un 'ListProperty' de' Clasificación' (usuario y puntaje) se opone. Pero aún así mantenga la calificación simple (num_ y avg_) para evitar el cálculo en cada lectura de la calificación de la cosa. Solo cuando desee inspeccionar los datos completos de calificación debería ingresar a la lista de calificaciones de los usuarios. –

+0

por lo que siempre debo mantener una tabla de resumen para la calificación donde subí la calificación de cada calificación de usuario para el cálculo. muchas gracias :) – Alon

0

No puedo responder a la parte de Google App Engine de su pregunta, pero su código (si cambia el + a un +=) es equivalente a:

ratingsum = sum(ratings) 

Estoy bastante seguro de que puede utilizar sum() en cualquier secuencia o objetos iterables que contengan números.

+0

a su respuesta, no puedo. es un flotador 4.5. No puedo resumirlo y sumarlo. no es iterable :( – Alon