2009-05-27 22 views
20

Soy nuevo en Django, pero la aplicación que tengo en mente podría llegar a tener las URL que se ven así:¿Son posibles las consultas asíncronas del modelo de Django?

http://mysite/compare/id_1/id_2 

Donde "id_1" y "ID_2" son identificadores de dos objetos de modelos distintos. En el controlador para "comparar" me gustaría asincrónicamente, y en paralelo, consultar y recuperar objetos id_1 e id_2.

¿Hay alguna manera de hacer esto usando una sintaxis estándar de Django? Estoy esperando pseudocódigo que termina buscando algo como esto:

import django.async 

# Issue the model query, but set it up asynchronously. 
# The next 2 lines don't actually touch my database 
o1 = Object(id=id_1).async_fetch() 
o2 = Object(id=id_2).async_fetch() 

# Now that I know what I want to query, fire off a fetch to do them all 
# in parallel, and wait for all queries to finish before proceeding. 

async.Execute((o2,o2)) 

# Now the code can use data from o1 and o2 below... 
+1

+1: Interesante pregunta :-) –

+0

Ya que todo se almacena en caché, no creo que te gustaría ver cualquier ganancia de este tipo de cosas. ¿Su objeto recupera realmente la parte más lenta de su aplicación? –

+0

Todo no se almacenará en caché, y esto es en realidad solo una versión simple del diseño real que estoy considerando. Imagine algo así como "buscar todas las publicaciones en este hilo" para el software del foro. La cantidad de publicaciones puede ser muy grande (1000) y el patrón de acceso puede ser tal que no estén todas en la memoria caché. – slacy

Respuesta

11

No hay operaciones estrictamente asíncronos como usted ha descrito, pero creo que se puede conseguir el mismo efecto mediante el uso de in_bulk operador de consulta de Django, que toma una lista de identificadores para consultar.

Algo como esto para el urls.py:

urlpatterns = patterns('', 
    (r'^compare/(\d+)/(\d+)/$', 'my.compareview'), 
) 

Y esto por la vista:

def compareview(request, id1, id2): 
    # in_bulk returns a dict: { obj_id1: <MyModel instance>, 
    #       obj_id2: <MyModel instance> } 
    # the SQL pulls all at once, rather than sequentially... arguably 
    # better than async as it pulls in one DB hit, rather than two 
    # happening at the same time 
    comparables = MyModel.objects.in_bulk([id1, id2]) 
    o1, o2 = (comparables.get(id1), comparables.get(id2))  
+0

¿in_bulk usa subprocesos para emitir las consultas en paralelo, o todavía están serializados? Estoy buscando minimizar la latencia de renderizado de página. – slacy

+0

A granel escribe una sola consulta SQL, por lo que no hay nada serializado o en paralelo ... solo hay un solo hit de DB que recupera ambas instancias. –

+0

Eso es desafortunado. En una base de datos rápida, es probable que sea más rápido emitir N consultas en paralelo que emitir una gigante para todos los objetos. in_bulk() reducirá levemente la latencia. Estoy esperando una O (1) página renderizada. – slacy

Cuestiones relacionadas