2010-04-19 5 views
23

Creo que estoy pasando por alto algo simple aquí, no me puedo imaginar que esto sea imposible de hacer.La desigualdad del filtro Appengine y el pedido falla

Quiero filtrar por un atributo de fecha y hora y luego ordenar el resultado por un atributo de entero de clasificación. Cuando trato de hacer esto:

query.filter("submitted >=" thisweek).order("ranking") 

consigo el siguiente:

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received ranking, expected submitted 

Huh? ¿Qué me estoy perdiendo?

Gracias.

Respuesta

20

El almacén de datos no es capaz de ordenar una consulta que contiene una desigualdad por cualquier propiedad que no sea la utilizada en la desigualdad.

Esto a menudo se puede solucionar agregando una propiedad que se puede filtrar con igualdad; en este caso, es posible tener un BooleanProperty rastreando si una entidad es de la semana actual, y actualizarla para todas las entidades al final de cada semana.

+0

Gracias. ¿Cómo podría escribir algo para actualizar todo mi almacén de datos si todas mis solicitudes solo deben tomar 10 segundos? –

+1

30 segundos, no 10, y puede usar algo como esto: http://blog.notdot.net/2010/03/Announcing-a-robust-datastore-bulk-update-utility-for-App- Engine –

+0

Nick : Eso se ve muy, muy útil. Muchas gracias. –

3

Utilicé otro truco, que funcionó simplemente por el formato en el que necesitaba mis datos (una lista de dicts). En este caso, ejecuto la consulta basada en fecha y hora, creo los dictados de los ents devueltos y luego los ordeno por la propiedad numérica 'contador'. Revertir el género me dio un orden descendente. Tenga en cuenta que solo solicité 10 resultados en un almacén de datos bastante pequeño. resultado

q = food.Food.all() 
q.filter("last_modified <=", now) 
q.filter("last_modified >=", hour_ago) 

ents = q.fetch(10) 

if ents: 
    results = [{ 
    "name": ent.name, 
    "counter": ent.counter 
    } for ent in ents] 

    # reverse list for 'descending' order 
    results.sort(reverse=True) 

Ejemplo:

[{'counter': 111L, 'name': u'wasabi'}, {'counter': 51L, 'name': u'honeydew'}, {'counter': 43L, 'name': u'mars bar'}, {'counter': 37L, 'name': u'scallop'}, {'counter': 33L, 'name': u'turnip'}, {'counter': 29L, 'name': u'cornbread'}, {'counter': 16L, 'name': u'mackerel'}, {'counter': 10L, 'name': u'instant coffee'}, {'counter': 3L, 'name': u'brussel sprouts'}, {'counter': 2L, 'name': u'anchovies'}] 
-1

La forma más sencilla sería dividir su consulta:

q1 = query.filter("submitted >=" thisweek) 
q2 = q1.order("ranking") 
+1

esto probablemente solo funcione con ndb aunque –

-1

no sé desde cuándo, pero SDK actual puede devolver el error sutil diferente :

BadArgumentError: First ordering property must be the same as inequality filter property, if specified for this query; received ranking, expected submitted 

En mi caso, Podría evitar el error con esto:

query.filter("submitted >=" thisweek).order("submitted").order("ranking") 

Editado 08/02/2013: Como Horselover grasa mencionado en el comentario, sólo se evita un error.

+5

esto evita la error de tiempo de ejecución, pero no hace lo que quieres! (probado en 'db' de todos modos) - ¡simplemente devuelve la consulta ordenada por' submit'! – HorseloverFat

+0

Sí, tienes razón. Cuando escribí la respuesta, pensé que funcionó bien. – hiroshi

Cuestiones relacionadas