2012-09-16 18 views
8

No puedo entender lo que significa este error y, al parecer, nadie tiene el mismo error en el InternetBadArgumentError: _MultiQuery con los cursores requiere para __key__ en NDB

BadArgumentError: _MultiQuery with cursors requires __key__ order

Esto sucede aquí:

return SocialNotification.query().order(-SocialNotification.date).filter(SocialNotification.source_key.IN(nodes_list)).fetch_page(10) 

La propiedad source_key es obviamente una clave y nodes_list es una lista de claves de entidades recuperadas anteriormente.

Lo que necesito es encontrar todos los SocialNotifications que tengan un campo source_key que coincidan con una de las claves de la lista.

+1

Todo lo que he encontrado para esto es un comentario en el código fuente SDK sobre la declaración que plantea esta excepción: "Los cursores solo son compatibles con ciertos pedidos". Supongo que si estás usando cursores, tienes que configurar el orden por clave por algún motivo, pero no tiene mucho sentido para mí. –

+0

Estoy haciendo casi esta consulta exacta. ¿Encontró una forma de resolver el problema o rediseñar los datos para evitarlo? – Dylan

Respuesta

17

El mensaje de error intenta decirle que las consultas que involucran IN y cursores se deben ordenar por __key__ (que es el nombre interno para la clave de la entidad). (Esto es necesario para que los resultados se puedan fusionar y hacer únicos). En este caso, debe reemplazar su llamada .order() por .order(SocialNotification._key).

+0

Sé que ya no trabajas en el equipo de motores de aplicaciones. ¿Pero es una buena práctica usar una clave privada de esa manera? Si es así, ¿por qué no hacerlo público? – mohi666

+0

__key__ es el nombre en el almacén de datos, no en Python. Tiene la forma especial para evitar colisiones con las propiedades definidas por el usuario. –

3

Parece que esto también ocurre cuando filtra por una desigualdad y trata de recuperar una página. (por ejemplo, MyModel.query(MyModel.prop != 'value').fetch_page(...)). Esto significa básicamente (a menos que me haya olvidado algo) que no puede buscar fetch_page cuando usa un filtro de desigualdad porque, por un lado, necesita que el género sea MyModel.prop, pero por otro lado necesita MyModel._key, que es :) dura

3

he encontrado la respuesta aquí: https://developers.google.com/appengine/docs/python/ndb/queries#cursors

puede cambiar la consulta a:

SocialNotification.query().order(-SocialNotification.date, SocialNotification.key).filter(SocialNotification.source_key.IN(nodes_list)).fetch_page(10)

con el fin de conseguir que esto funcione. Tenga en cuenta que parece ser lento (18 segundos) cuando nodes_list es grande (1000 entidades), al menos en el servidor de desarrollo. No tengo una gran cantidad de datos de prueba en un servidor de prueba.

0

Tuve el mismo error al filtrar sin un grupo. El error ocurrió cada vez que mi filtro devolvió más de un resultado.

Para solucionarlo, en realidad tuve que agregar ordenar por clave.

Cuestiones relacionadas