Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Un objeto Query representa una consulta de NDB, una solicitud para una lista de entidades filtrada y ordenada.
Esta página contiene documentación de referencia. Para obtener una explicación general de las consultas de NDB, ve a Consultas.
Opciones de consulta
Muchos métodos de consulta usan un conjunto estándar de opciones adicionales, ya sea en forma de argumentos de palabra clave, como keys_only=True o como el objeto QueryOptions pasado con options=QueryOptions(...).
Las consultas admiten una variedad de opciones de configuración.
Estas se especifican por argumentos de palabra clave para los métodos de Query:
Argumento
Tipo
Predeterminado
Descripción
keys_only
bool
False
Todas las operaciones muestran claves en lugar de entidades.
projection
tupla (o lista) de propiedades (o strings)
None
Las operaciones muestran las entidades solo con el conjunto de propiedades especificado.
projection=[Article.title, Article.date] o projection=['title', 'date'] recuperan las entidades solo con estos dos campos establecidos.
(Ve a Consultas de proyección).
offset
int
0
Cantidad de resultados de la consulta que se omitirán.
limit
int
Sin límite
Cantidad máxima de resultados de la consulta que se mostrarán.
batch_size
int
20
Tamaño del lote.
Afecta solo a la eficacia de las consultas. Los tamaños de lote grandes usan más memoria, pero realizan menos llamadas RPC.
Anula el plazo de RPC (que se configura de forma predeterminada dentro de 5 segundos si no se anula cuando se crea Context).
read_policy
ndb.EVENTUAL_CONSISTENCY
La política de lectura. Establece ndb.EVENTUAL_CONSISTENCY para obtener resultados tal vez más rápidos sin esperar a que Datastore aplique los cambios pendientes a todos los registros que se muestran.
Para ejecutar una consulta con un conjunto de opciones específico, pasa los argumentos de palabra clave al método aplicable:
qry=Employee.query().filter(...).order(...)# Create a queryforacctinqry.fetch(10,offset=20):# Skip the first 20printacct
En ocasiones, es posible que desees guardar un conjunto de opciones de consulta y usarlas en diversos lugares. Aunque simplemente puedes mantenerlos en un diccionario y pasar este diccionario a los métodos con **kwds, también puedes crear un objeto QueryOptions y pasarlo con las opciones.
Los siguientes dos ejemplos son equivalentes:
Por lo general, una aplicación crea un Query llamando a Model.query(). Sin embargo, también puede llamar a ndb.Query().
Argumentos
tipo
String de tipo opcional. Normalmente, el nombre de una clase de entidad.
ancestor
Clave principal opcional.
filters
Nodo opcional que representa un árbol de expresión de filtro.
orders
Opcional, objetodatastore_query.Order.
app
ID de aplicación opcional.
namespace
Espacio de nombres opcional. Si no se especifica, se usará el espacio de nombres predeterminado en el momento en que se ejecute la consulta.
projection
Lista o tupla opcional de propiedades que se proyectarán.
group_by
Lista o tupla opcional de propiedades que se agruparán.
default_options
Objeto QueryOptions opcional que proporciona las opciones de consulta predeterminadas que se usarán cuando se ejecute la consulta.
Métodos de instancia
filtro(filter1, filter2, ...)
Muestra una Query nueva con los filtros adicionales aplicados.
Usa los argumentos del filtro como se describe en Consultas.
qry.filter(filter1).filter(filter2) es equivalente a lo siguiente a qry.filter(filter1, filter2)
get(**q_options)
Muestra el primer resultado de la consulta, si existe alguno (sino se muestra None). Esto es similar a llamar a q.fetch(1) y mostrar el primer elemento de la lista de resultados.
Muestra una Query nueva con órdenes de clasificación adicionales aplicados.
Usa uno o más argumentos que son propiedades o propiedades "negadas".
Por ejemplo, para ordenar usuarios por edad y “definir empates” por nombre, puedes usar algo como qry.order(-Account.birthday, Account.name)
vincular(...values...)
Esta función se usa con las consultas de GQL que usan vinculaciones de parámetros (:1, :2, etc.) o vinculaciones con nombre (:foo, :bar, etcétera). Vincula los valores que se pasan a los parámetros.
Para vincular los parámetros, puedes realizar una llamada similar a qry.bind("USA", 49).
Para vincular los parámetros con nombre, puedes realizar una llamada similar a qry.bind(region = "USA", threshold = 49).
Muestra un objeto QueryQuery nuevo con los valores del parámetro vinculado.
count(limit=None, **q_options)
Muestra la cantidad de resultados de la consulta (hasta cierto límite).
Esto muestra el mismo resultado que len(q.fetch(limit)), pero de manera más eficiente.
Cuenta de forma asíncrona la cantidad de resultados de consultas, hasta un límite; muestra un Future cuyo resultado es un número.
Esta es la versión asíncrona de count().
fetch(limit, **q_options)
Recupera una lista de resultados de la consulta (hasta cierto límite).
Recupera de manera asíncrona una lista de resultados de la consulta (hasta cierto límite).
Muestra un Future
cuyo resultado es una lista de resultados.
Esta es la versión asíncrona de fetch().
fetch_page(page_size, **q_options)
Recupera una "página" de resultados. Este es un método especializado para paginar las interfaces de usuario.
Argumentos
page_size
Se mostrará esta cantidad de resultados como máximo.
cursor un cursor de consultas que dirige al “siguiente” lote de resultados. Si no hay más resultados, es posible que esto se muestre como None.
morebool que indica si hay más resultados (probables) después de este lote.
Si es False, no hay más resultados; si es True, probablemente hayan más resultados.
Para recuperar la página siguiente, pasa el cursor que muestra una llamada a la llamada siguiente con start_cursor=cursor.
Una expresión común es pasar el cursor al cliente mediante cursor.urlsafe() y reconstruir ese cursor en una solicitud posterior con Cursor(urlsafe=string).
fetch_page_async(page_size, **q_options)
Recupera de manera asíncrona una "página" de resultados. Esta es la versión asíncrona de fetch_page().
get_async(**q_options)
Muestra el primer resultado de la consulta de forma asíncrona, si corresponde None. Esta es la versión asíncrona de get ().
Mapea una función de devolución de llamada o tasklet a los resultados de la consulta. Es decir, aplica la función (o tasklet) a cada entidad en los resultados de la consulta.
Argumentos
callback
Una función o tasklet que se aplicará a cada resultado.
pass_batch_into_callback
Si es True, llama a la función de devolución de llamada con argumentos de información del lote, como se describe a continuación.
Firma de la devolución de llamada Normalmente, se llama a la función de devolución de llamada con una entidad como argumento. Sin embargo, si se proporciona keys_only=True, se llama con una clave.
Si se proporciona pass_batch_into_callback=True, la devolución de llamada se realiza con tres argumentos: el lote actual, el índice del lote y la entidad o Key en ese índice.
La devolución de llamada puede mostrar lo que desee. Si la devolución de llamada es None, se supone que una devolución de llamada trivial solo muestra la entidad o clave que se le pasó.
merge_future opcional La merge_future es un argumento avanzado que se puede usar para anular cómo se combinan los resultados de la devolución de llamada en el valor general de que se muestra de map(). Según la configuración predeterminada, se genera una lista de valores de retorno de la devolución de llamada. Cuando se sustituye una cantidad pequeña de alternativas especializadas, puedes organizarlas de otro modo. Consulta el código fuente de tasklets.MultiFuture para ver la implementación predeterminada y una descripción del protocolo que debe implementar el objeto merge_future. Las alternativas del mismo módulo incluyen QueueFuture, SerialQueueFuture y ReducingFuture.
Muestra una lista de resultados de todas las devoluciones de llamada.
(Pero consulta "merge_future opcional" más arriba). Muestra el momento en que la consulta se ejecutó hasta completarse y en que se mostraron todas las devoluciones de llamada.
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Información o código de muestra incorrectos","incorrectInformationOrSampleCode","thumb-down"],["Faltan la información o los ejemplos que necesito","missingTheInformationSamplesINeed","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-09-04 (UTC)"],[[["\u003cp\u003eThis documentation covers how to use NDB queries within the legacy App Engine standard environment's first-generation runtimes, noting that for App Engine Python 3, a migration guide is recommended.\u003c/p\u003e\n"],["\u003cp\u003eAn NDB \u003ccode\u003eQuery\u003c/code\u003e object is used to request a filtered and sorted list of entities, and you can create one using the \u003ccode\u003e<var>Model</var>.query()\u003c/code\u003e method or directly using \u003ccode\u003endb.Query()\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eQueries can be configured using various keyword arguments or a \u003ccode\u003eQueryOptions\u003c/code\u003e object, allowing for customizations such as returning only keys (\u003ccode\u003ekeys_only\u003c/code\u003e), limiting results (\u003ccode\u003elimit\u003c/code\u003e), skipping results (\u003ccode\u003eoffset\u003c/code\u003e), or specifying a data projection (\u003ccode\u003eprojection\u003c/code\u003e).\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eQuery\u003c/code\u003e object has several instance methods like \u003ccode\u003efilter()\u003c/code\u003e, \u003ccode\u003eorder()\u003c/code\u003e, \u003ccode\u003eget()\u003c/code\u003e, \u003ccode\u003ecount()\u003c/code\u003e, \u003ccode\u003efetch()\u003c/code\u003e, \u003ccode\u003efetch_page()\u003c/code\u003e, \u003ccode\u003emap()\u003c/code\u003e and their async versions, allowing for advanced query customization, execution, and data retrieval.\u003c/p\u003e\n"],["\u003cp\u003eQuery methods often accept keyword arguments, such as \u003ccode\u003elimit\u003c/code\u003e, \u003ccode\u003eoffset\u003c/code\u003e, \u003ccode\u003ekeys_only\u003c/code\u003e, and \u003ccode\u003eprojection\u003c/code\u003e, to refine the results, and these same options can be used in a \u003ccode\u003eQueryOptions\u003c/code\u003e object.\u003c/p\u003e\n"]]],[],null,["# NDB Query Class\n\n| This page describes how to use the legacy bundled services and APIs. This API can only run in first-generation runtimes in the App Engine standard environment. If you are updating to the App Engine Python 3 runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/python-differences) to learn about your migration options for legacy bundled services.\n\nA `Query` object represents an NDB query, a request for\na filtered, sorted list of entities.\n\nThis page contains reference documentation. For a general discussion\nof NDB queries, see [Queries](/appengine/docs/legacy/standard/python/ndb/queries).\n\nQuery Options\n-------------\n\nMany query methods take a standard set of additional\noptions, either in the form of keyword arguments such as\n`keys_only=True`, or as\n`QueryOptions` object passed with\n`options=QueryOptions(...)`.\n\nQueries support a variety of configuration options.\nThese are specified by keyword arguments to the `Query` methods:\n\nTo run a query with a specific set of options,\npass the keyword arguments to the applicable method:\n\n```python\nqry = Employee.query().filter(...).order(...) # Create a query\nfor acct in qry.fetch(10, offset=20): # Skip the first 20\n print acct\n```\n\nOccasionally, you might want to keep a set of query options\naround and use them in various places. While you could just\nkeep them in a dictionary and pass this dictionary to the\nmethods using `**kwds`, you can also create a\n`QueryOptions` object and pass\nit using the options keyword argument.\nThe following two examples are equivalent:\n\n```python\nqo = ndb.QueryOptions(keys_only=True, offset=20)\nresults = qry.fetch(10, options=qo)\nresults = qry.fetch(10, keys_only=True, offset=20)\n```\n\nConstructor\n-----------\n\nTypically, an application creates a `Query` by calling\n\u003cvar translate=\"no\"\u003eModel\u003c/var\u003e`.query()`. But it's also possible to call\n`ndb.Query()`.\n\n**Arguments**\n\nkind\n: Optional kind string. Normally, the name of a entity class.\n\nancestor\n: Optional ancestor Key.\n\nfilters\n: Optional Node representing a filter expression tree.\n\norders\n: Optional `datastore_query.Order` object.\n\napp\n: Optional app id.\n\nnamespace\n: Optional namespace. If not specified,\n the default namespace at the time the query is executed will be used.\n\nprojection\n: Optional list or tuple of properties to project.\n\ngroup_by\n: Optional list or tuple of properties to group by.\n\ndefault_options\n: Optional\n [QueryOptions](/appengine/docs/legacy/standard/python/ndb/queryclass#kwdargs_options) object\n giving default query options to be used when the query is executed.\n\nInstance Methods\n----------------\n\nfilter(\u003cvar translate=\"no\"\u003efilter1, filter2, ...\u003c/var\u003e)\n: Returns a new `Query` with additional filter(s) applied.\n Takes filter arguments as described in\n [Queries](/appengine/docs/legacy/standard/python/ndb/queries).\n `qry.filter(`\u003cvar translate=\"no\"\u003efilter1\u003c/var\u003e`).filter(`\u003cvar translate=\"no\"\u003efilter2\u003c/var\u003e`)`\n is equivalent to\n `qry.filter(`\u003cvar translate=\"no\"\u003efilter1\u003c/var\u003e`, `\u003cvar translate=\"no\"\u003efilter2\u003c/var\u003e`)`\n\nget(\\*\\*q_options)\n: Returns the first query result, if any (otherwise `None`).\n This is similar to calling `q.fetch(1)` and returning\n the first item of the list of results.\n\n **Arguments**\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\norder(\u003cvar translate=\"no\"\u003eorder1\u003c/var\u003e, \u003cvar translate=\"no\"\u003eorder2\u003c/var\u003e, ...)\n: Returns a new `Query` with additional sort order(s) applied.\n Takes one or more arguments which are properties or \"negated\" properties.\n For example, to sort users by age and \"break ties\" by name, you might\n use something like `qry.order(-Account.birthday, Account.name)`\n\nbind(\u003cvar translate=\"no\"\u003e...values...\u003c/var\u003e)\n: This function is for use with GQL queries that use parameter\n bindings (`:1`, `:2`, etc.) or named bindings\n (`:foo`, `:bar`, etc.). It binds the passed\n values to the parameters.\n\n To bind parameters, you might call something like\n `qry.bind(\"USA\", 49)`.\n To bind named parameters, you might call something like\n `qry.bind(region = \"USA\", threshold = 49)`.\n\n Returns a new `Query` object with the parameter values bound.\n\ncount(limit=None, \\*\\*q_options)\n: Returns the number of query results, up to a limit.\n This returns the same result as `len(q.fetch(limit))` but more\n efficiently.\n\n **Arguments**\n\n limit\n : How many results to count at most\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n and [context options](/appengine/docs/legacy/standard/python/ndb/functions#context_options)\n are supported.\n\ncount_async(limit, \\*\\*q_options)\n: Asynchronously counts the number of query results, up to a limit;\n it returns a [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n whose result is a number.\n This is the asynchronous version of [count()](#Query_count).\n\nfetch(limit, \\*\\*q_options)\n\n: Fetch a list of query results, up to a limit. **Arguments**\n\n limit\n : How many results to count at most\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\nfetch_async(limit, \\*\\*q_options)\n: Asynchronously fetch a list of query results, up to a limit.\n Returns a [Future](/appengine/docs/legacy/standard/python/ndb/futureclass)\n whose result is a list of results.\n This is the asynchronous version of [fetch()](#Query_fetch).\n\nfetch_page(page_size, \\*\\*q_options)\n\n: Fetch a \"page\" of results. This is a specialized method for use by paging user interfaces. **Arguments**\n\n page_size\n : At most this many results will be returned.\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\n Returns a tuple `(`\u003cvar translate=\"no\"\u003eresults\u003c/var\u003e`,\n `\u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e`, `\u003cvar translate=\"no\"\u003emore\u003c/var\u003e`)`:\n\n - \u003cvar translate=\"no\"\u003eresults\u003c/var\u003e list of query results\n - \u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e a [query cursor](/appengine/docs/legacy/standard/python/ndb/queries#cursors) pointing to the \"next\" batch of results. If there are no more results, this might be `None`.\n - \u003cvar translate=\"no\"\u003emore\u003c/var\u003e `bool` indicating whether there are (likely) more results after this batch. If `False`, there are no more results; if `True`, there are *probably* more results.\n\n To fetch the next page,\n pass the cursor returned by one call to the next call using\n `start_cursor=`\u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e.\n A common idiom is to pass the cursor to\n the client using \u003cvar translate=\"no\"\u003ecursor\u003c/var\u003e`.urlsafe()`\n and to reconstruct that cursor on a subsequent request using\n `Cursor(urlsafe=`\u003cvar translate=\"no\"\u003estring\u003c/var\u003e`)`.\n\nfetch_page_async(page_size, \\*\\*q_options)\n: Asynchronously fetch a \"page\" of results. This is the asynchronous version\n of [fetch_page()](#Query_fetch_page).\n\nget_async(\\*\\*q_options)\n: Asynchronously returns the first query result, if any\n (otherwise `None`). This is the asynchronous version\n of [get()](#Query_get).\n\niter(\\*\\*q_options)\n\n: Constructs and returns an iterator over the query. **Arguments**\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\n Returns a [QueryIterator](/appengine/docs/legacy/standard/python/ndb/queries#iterators) object.\n\nmap(callback, pass_batch_into_callback=None, merge_future=None, \\*\\*q_options)\n\n: Map a callback function or tasklet over the query results. That is, apply the function (or tasklet) to each entity in the query results. **Arguments**\n\n callback\n : A function or tasklet to be applied to each result.\n\n pass_batch_into_callback\n : If `True`, calls the callback with batch information\n arguments as described below.\n\n merge_future\n : Optional [Future](/appengine/docs/legacy/standard/python/ndb/futureclass) subclass;\n see below.\n\n \\*\\*q_options\n : All [query options keyword arguments](#kwdargs_options)\n are supported.\n\n *Callback signature* The callback is normally called with an entity\n as argument. However, if\n `keys_only=True` is given, it is called\n with a [Key](/appengine/docs/legacy/standard/python/ndb/keyclass).\n If `pass_batch_into_callback=True` is given, the callback is\n called with three arguments: the current batch, the index within\n the batch, and the entity or `Key` at that index.\n The callback can\n return whatever it wants. If the callback is `None`, a trivial\n callback is assumed that just returns the entity or key passed in.\n\n *Optional `merge_future`* The `merge_future`\n is an advanced argument\n that can be used to override how the callback results are combined\n into the overall `map()` return value. By default, a list of\n callback return values is produced. By substituting one of a\n small number of specialized alternatives you can arrange\n otherwise. See the source code for\n `tasklets.MultiFuture` for the default\n implementation and a description of\n the protocol the `merge_future`\n object must implement. Alternatives from the same\n module include `QueueFuture`, `SerialQueueFuture`\n and `ReducingFuture`.\n\n Returns a list of the results of all the callbacks.\n (But see 'optional `merge_future`' above.) It returns\n when the query has run to completion and all callbacks have returned.\n\nmap_async(callback, pass_batch_into_callback=None, merge_future=None, \\*\\*q_options)\n: Asynchronously map a callback function or tasklet over the query results.\n This is the asynchronous version of [map()](#map)."]]