2010-06-14 22 views
13

Me gustaría guardar un criterio de conjunto de preguntas para la DB para su reutilización.¿Cómo obtener y/o guardar los criterios del conjunto de preguntas en la base de datos?

Por lo tanto, si tengo un conjunto de consultas como:

Client.objects.filter(state='AL') 

# I'm simplifying the problem for readability. In reality I could have 
# a very complex queryset, with multiple filters, excludes and even Q() objects. 

me gustaría guardar en la base de datos no los resultados del conjunto de consultas (es decir, los registros de los clientes individuales que tienen un campo de comparación de estados 'AL') ; pero el conjunto de consultas en sí (es decir, los criterios utilizados en el filtrado del modelo de cliente).

El objetivo final es tener un "filtro guardado" que pueda leerse desde la base de datos y ser utilizado por múltiples aplicaciones django.

Al principio pensé que podría serializar el queryset y guardarlo. Pero la serialización de un conjunto de preguntas realmente ejecuta la consulta, y luego termino con una lista estática de clientes en Alabama en el momento de la serialización. Quiero que la lista sea dinámica (es decir, cada vez que leo el queryset del DB, debería ejecutar y recuperar la lista más reciente de clientes en Alabama).


Editar: Alternativamente, ¿es posible obtener una lista de filtros aplicados a un conjunto de preguntas?

Algo así como:

qs = Client.objects.filter(state='AL') 
filters = qs.getFilters() 
print filters 

{ 'state': 'AL' } 

Respuesta

14

Puede hacer lo que dice JCD, almacenando el sql.

También puede almacenar las condiciones.

In [44]: q=Q(Q(content_type__model="User") | Q(content_type__model="Group"),content_type__app_label="auth") 

In [45]: c={'name__startswith':'Can add'} 

In [46]: Permission.objects.filter(q).filter(**c) 
Out[46]: [<Permission: auth | group | Can add group>, <Permission: auth | user | Can add user>] 

In [48]: q2=Q(Q(content_type__model="User") | Q(content_type__model="Group"),content_type__app_label="auth", name__startswith='Can add') 

In [49]: Permission.objects.filter(q2) 
Out[49]: [<Permission: auth | group | Can add group>, <Permission: auth | user | Can add user>] 

En ese ejemplo se ve que las condiciones son los objetos c y q (a pesar de que se pueden unir en un solo objeto, q2). A continuación, puede serializar estos objetos y almacenarlos en la base de datos como cadenas.

--edit--

Si es necesario tener todas las condiciones en un solo registro de base de datos, puede almacenarlos en un diccionario

{'filter_conditions': (cond_1, cond_2, cond_3), 'exclude_conditions': (cond_4, cond_5)} 

y luego serializar el diccionario.

1

puede crear su propio modelo para almacenar sus consultas. campo Primera lata contiene FK ContentTypes segundo campo puede ser campo de texto simplemente con su consulta, etc.

Y después de que se puede utilizar para establecer Q object queryset para su modelo.

+0

¿Te gustaría explicar cómo se aborda el problema de obtener un criterio de conjunto de preguntas y almacenarlo en la base de datos y luego recuperarlo para m la base de datos y ejecutarlo? – cethegeek

4

Puede almacenar el sql generado por la consulta utilizando el método _as_sql() del conjunto de consultas. El método tiene una conexión de base de datos como argumento, por lo que haría:

from app.models import MyModel 
from django.db import connection 

qs = MyModel.filter(pk__gt=56, published_date__lt=datetime.now()) 
store_query(qs._as_sql(connection)) 
+3

En Django reciente, ahora es .query(). – Cerin

Cuestiones relacionadas