2011-12-02 8 views
7

Di creo un QuerySet como:Filtra un QuerySet de django con la consulta de otro QuerySet: ¿posible?

q0 = Thing.objects.all() 
fq0 = q0.filter(x=y) 

en el tiempo t0. Luego agrego algunas cosas nuevas a Thing db. Estas cosas forman el QuerySet:

q1 = Thing.objects.filter(created_gt=t0) 

que desea generar el QuerySet:

fq = (q0 | q1).filter(x=y) 

sin tener que saber lo que X o Y son. En otras palabras, me gustaría poder hacer algo como esto:

fq1 = q1.filter(query=fq0.query) 
fq = fq0 | fq1 

¿Esto es posible? La configuración manual de

q1.query = fq0.query 

limita a establecer q1 == fq0. He visto a algunas personas preguntando acerca de extraer el sql de un conjunto de consulta, pero esto realmente no me ayudará.

Respuesta

1

Por lo que puedo ver mirando a través de los módulos QuerySet y Query, Django no mantiene un registro en ejecución de los argumentos que envía a un conjunto de consulta. Traduce todo directamente en fragmentos de consulta de nivel inferior y luego descarta los tokens que le has dado. Por lo tanto, descubrir cómo se ha filtrado un conjunto de consulta sin conocimiento previo es una tarea no trivial.

Se podía hacerlo de forma manual por la piratería en conjunto algo como lo siguiente:

q0 = Thing.objects.all() 
filter_kwargs = {'x': y} 
fq0 = q0.filter(**filter_kwargs) 
fq0.saved_filter_kwargs = filter_kwargs 

##### snip ##### 

fq1 = q1.filter(**fq0.saved_kwargs) 

el tipo de desagradable sin embargo. Probablemente sea mejor tratar de resolver este problema de una manera diferente. Te recomiendo que publiques otra pregunta e incluyas lo que intentas lograr a nivel general, y podríamos ayudarte a encontrar una mejor arquitectura.

+0

Imagen grande: caché fq0, genera fq filtrando solo q1. Tienes razón en que esta es una solución desagradable. Se vuelve aún más desagradable cuando estás almacenando cosas en el caché. Afortunadamente encontré una mejor solución. Gracias por tu ayuda. Te recompé, pero necesito más representantes. –

+0

@dmrparthenon debe responder a su pregunta con la solución que encontró para ayudar a la comunidad y marcar como resuelta responder su propia respuesta. –

12

¿Qué tal algo como lo siguiente:

Thing.objects.filter(field__in=Another_queryset.object.filter())

Django hará consulta y subconsulta.

Cuestiones relacionadas