2012-03-15 17 views
5

Posso o dovrei mai farlo in una vista?Modifica di un oggetto QuerySet al volo in Django

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

Ha funzionato come un campione, ma ho provato una cosa simile da qualche altra parte e mi è stato sempre risultati strani, il che implica che gli oggetti QuerySet non piace scherzare. E, non ho visto nulla nel documento buono o cattivo per questo tipo di trucco.

So che ci sono altri modi per farlo, ma in particolare voglio sapere se questa è una cattiva idea, perché è male, e se è davvero male, quale è il modo "migliore" più django/pitoni cambiare i valori al volo sarebbe.

risposta

6

Questo va bene fintanto che non si esegue alcuna operazione successiva, il queryset verrà rivalutato, ad esempio tagliandolo. Questo renderà un'altra query al database e tutti gli oggetti modificati verranno sostituiti con quelli nuovi.

Un modo per proteggersi contro questo sarebbe convertire in un primo elenco:

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

In questo modo, inoltre affettare ecc non causerà una chiamata db fresca, e verrà conservato eventuali modifiche.

+0

Grazie, Daniel. Il tuo esempio è esattamente ciò che intendevo quando ho detto "So che ci sono altri modi per farlo" e apprezzo anche i tuoi chiarimenti. Oh, e il tuo esempio di prendere una fetta è esattamente ciò che stava causando gli strani risultati che ho menzionato. Sono un po 'imbarazzato che non l'abbia capito, e sono contento che tu l'abbia indicato. Saluti! – proffrink

0

Sì. Vedere documentazione here

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

vorrei andare con linguaggio di Django. Esegue l'SQL con una singola istruzione con 'where' e 'update', inviando invece più istruzioni SQL come farebbe il tuo codice. Ciò consente di risparmiare tempo. Verifica con Django 'connection' per testare l'ora SQL.

+4

Grazie, e mi scuso se non ero chiaro, ma non mi interessa aggiornare il database, semplicemente modificando l'output per scopi di visualizzazione. – proffrink

Problemi correlati