2011-05-13 13 views
5

Cuando hago algo así comoORM de Django y golpear DB

I. objects = Model.objects.all()

y luego

II. objects.filter(field_1=some_condition)

Pulse db cada vez que en el paso 2 con varias condiciones. ¿Hay alguna manera de obtener todos los datos en la primera acción y luego simplemente cuidar el resultado?

Respuesta

9

En realidad no golpeas el db hasta que evalúes el qs, las consultas son lazy.

Más información here.

edición:

Después de volver a leer su pregunta se hace evidente que estabas preguntando cómo evitar golpes db cuando se filtra para diferentes condiciones.

qs = SomeModel.objects.all() 

qs1 = qs.filter(some_field='some_value') 
qs2 = qs.filter(some_field='some_other_value') 

Normalmente querrías que la base de datos hiciera el filtrado por ti.

Puede forzar una evaluación de los qs convirtiéndolo en una lista. Esto evitaría más éxitos de DB, sin embargo, sería peor que tener su DB devolver resultados.

qs_l = list(qs) 
qs1_l = [element for element in qs_l if element.some_field='some_value'] 
qs2_l = [element for element in qs_l if element.some_field='some_other_value'] 
+0

Gracias una pregunta más. ¿Puedo presionar db sin convertir QuerySet a una lista? O tal vez puedo convertir la lista a un QuerySet? – alexvassel

+0

No puede convertir la lista al conjunto de preguntas. Puede pulsar db de varias maneras, se enumeran en el segundo enlace de la respuesta de DTing. – DrTyrsa

+0

Puede acceder a la base de datos con los métodos mencionados en el enlace "Leer más aquí", p. iterando, cortando con particiones, etc. Esta respuesta http://stackoverflow.com/questions/1058135/django-convert-a-list-back-to-a-queryset/1058152#1058152 y la pregunta relacionada pueden ser de interés para tú. – DTing

1

¿Por qué no haces objs = Model.objects.filter(field=condition)? Dicho esto, una vez que se ejecuta la consulta SQL, puede usar expresiones de Python para realizar más filtrado/procesamiento sin incurrir en visitas adicionales a la base de datos.

2

Por supuesto, llegará a db todo el tiempo. filter() se transforma en instrucción SQL que ejecuta su db, no puede filter sin presionarlo. Para que pueda recuperar todos los objetos que necesita con values() o list(Model.objects.all()) y, como Zeekay sugirió, utilice expresiones de Python (como listas de comprensión) para un filtrado adicional.

+0

eso no es cierto. revise los enlaces en la respuesta: http://stackoverflow.com/a/5989752/4213969 – Vladimir

Cuestiones relacionadas