2012-03-15 15 views
5

¿Puedo o debo hacer esto en una vista?Cambiar un objeto QuerySet sobre la marcha en Django

a = SomeTable.objects.all() 
for r in a: 
    if r.some_column == 'foo': 
     r.some_column = 'bar' 

funcionó como un campeón, pero intentó algo similar en otro lugar y yo estaba recibiendo resultados extraños, lo que implica que los objetos QuerySet no les gusta que se podía jugar. Y, no vi nada en los documentos bueno o malo para este tipo de truco.

Sé que hay otras maneras de hacerlo, pero específicamente quiero saber si esta es una mala idea, por qué es mala, y si es realmente mala, cuál es la "mejor" forma django/pythonic para cambiar los valores sobre la marcha sería.

Respuesta

6

Esto está bien, siempre que no haga nada más tarde que hará que el conjunto de consulta se reevalúe, por ejemplo, cortarlo. Eso hará otra consulta a la base de datos, y todos sus objetos modificados serán reemplazados por otros nuevos.

Una manera de protegerse contra la que habría de convertir a una primera lista:

a = list(SomeTable.objects.all()) 

De esta manera, además de rebanado, etc. no causará una llamada db fresco, y se conserva ninguna modificación.

+0

Gracias, Daniel. Tu ejemplo es exactamente lo que quise decir cuando dije "sé que hay otras formas de hacerlo", y también aprecio tu aclaración. Ah, y tu ejemplo de tomar una porción es exactamente lo que estaba causando los extraños resultados que mencioné. Estoy un poco avergonzado de no haber entendido eso, y me alegro de que lo hayas señalado. ¡Aclamaciones! – proffrink

0

Sí. Ver documentos here

SomeTable.objects.filter(some_column='foo').update(some_column='bar') 

Me gustaría ir con lenguaje de Django. Ejecuta el SQL con una única instrucción con 'dónde' y 'actualizar' en lugar de enviar múltiples instrucciones SQL como lo haría su código. Esto ahorra tiempo. Consulte con Django's 'connection' para probar la hora de SQL.

+4

Gracias, y me disculpo si no estaba claro, pero no estoy interesado en actualizar la base de datos, simplemente modificando la salida para fines de visualización. – proffrink

Cuestiones relacionadas